设计模式-抽象工厂模式介绍:
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在抽象工厂中,客户端使用抽象工厂来获取一组相关的产品对象,而不需要知道具体的产品是如何被创建出来的。
角色和职责:
1 抽象工厂(Abstract Factory):
- 定义一个接口,声明了一系列用于创建产品的方法,每个方法对应于一种特定类型的产品。
- 通常是一个接口或者抽象类,包含多个生产不同产品家族的方法。
2 具体工厂(Concrete Factory):
- 实现了抽象工厂接口,提供了用于生成实际产品的具体逻辑。
- 根据不同的业务需求,创建并返回相应产品族中的具体产品对象。
3 抽象产品(Abstract Product):
- 定义了一个或多个产品对象的接口,这些产品属于同一产品等级结构。
- 可能是抽象类或接口,为一类产品提供了通用接口定义。
4 具体产品(Concrete Product):
- 是抽象产品接口的具体实现类。
- 具体工厂通过调用这些具体产品的构造函数或其他方式来创建实例。
工作原理:
- 客户端代码不直接实例化具体产品对象,而是通过调用抽象工厂提供的方法来获取所需的产品对象。
- 抽象工厂确保所创建的产品对象是相关的,也就是说,它们可以协同工作,属于同一个产品族。
- 当系统需要扩展时,只需要增加新的具体工厂和对应的新产品系列即可,原有代码无须修改,从而符合开闭原则。
优点:
- 将客户程序与具体产品类的实现细节解耦,增强了系统的可扩展性和灵活性。
- 支持产品族的独立开发,各个产品族之间互不影响。
- 有利于应对大量产品族以及多种变化的需求场景。
缺点:
- 增加新产品种类时,需要修改抽象工厂和所有具体工厂的接口及其实现,可能会导致类的数量急剧增加,增加了系统的复杂性。
- 如果产品之间的关系较复杂,可能使得抽象工厂的设计变得较为困难。
应用场景:
- 在软件系统中,有多个产品族组成,并且这些产品族间存在一定的关联或依赖关系。
- 当系统需要独立于具体产品的创建、组合和表示时。
- 当要强调一系列相关的产品对象的整体性时。
示例代码:
java
// 抽象产品
public interface Color {
String getColor();
}
public interface Shape {
String getShape();
}
// 具体产品
public class RedColor implements Color {
@Override
public String getColor() {
return "Red";
}
}
public class BlueColor implements Color {
@Override
public String getColor() {
return "Blue";
}
public class Circle implements Shape {
@Override
public String getShape() {
return "Circle";
}
}
public class Square implements Shape {
@Override
public String getShape() {
return "Square";
}
// 抽象工厂
public interface Factory {
Color getColor();
Shape getShape();
}
// 具体工厂
public class PrimaryColorsFactory implements Factory {
@Override
public Color getColor() {
return new RedColor(); // 或者返回 BlueColor
}
@Override
public Shape getShape() {
return new Circle(); // 或者返回 Square
}
}
public class SecondaryColorsFactory implements Factory {
// 创建其他颜色和形状的实现...
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Factory primaryColors = new PrimaryColorsFactory();
System.out.println("Primary Colors Factory: " + primaryColors.getColor().getColor()
+ " and " + primaryColors.getShape().getShape());
Factory secondaryColors = new SecondaryColorsFactory();
// 使用secondaryColors来获取产品...
}
}
关于抽象工厂模式 与 工厂方法模式 对比:
- 工厂方法模式更关注单一类型的产品创建,通过继承和多态性扩展产品种类。
- 抽象工厂模式更关注一系列相关的产品家族的创建,适用于需要跨产品线保持一致性的情况,比如不同操作系统的界面组件、不同规格的产品系列等。
- 工厂方法模式的结构相对简单,抽象工厂模式涉及的类和接口更多,因此更适用于产品结构较为复杂、有多种产品组合需要维护的场景。