抽象工厂模式(Abstract Factory Pattern
)
意图
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体的类。
动机
工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如家电工厂既生产电视机又生产洗衣机或空调,华为工厂既生产华为手机又生产华为平板等。
当我们需要创建产品家族或想让生产的相关产品集合起来时,可以使用抽象工厂模式。抽象工厂模式中,将不同具体工厂生产的同一等级的产品称为同一产品等级,将同一个具体工厂所生产的位于不同等级的产品称为产品族。

适用性
抽象工厂模式通常适用于以下场景:
- 当需要创建的对象是一系列相互关联或相互依赖的产品族时,如电器工厂中的电视机、洗衣机、空调等。
- 系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。
- 系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构。
结构

实现
public interface ProductA {
void show();
}
public class ConcreteProductA1 implements ProductA {
@Override
public void show() {
System.out.println("具体产品A1...");
}
}
public class ConcreteProductA2 implements ProductA {
@Override
public void show() {
System.out.println("具体产品A2...");
}
}
public interface ProductB {
void show();
}
public class ConcreteProductB1 implements ProductB {
@Override
public void show() {
System.out.println("具体产品B1...");
}
}
public class ConcreteProductB2 implements ProductB {
@Override
public void show() {
System.out.println("具体产品B2...");
}
}
public interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
// 创建一个具体的产品家族,由子类决定创建具体的产品
public class ConcreteFactory1 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB1();
}
}
// 创建一个具体的产品家族,由子类决定创建具体的产品
public class ConcreteFactory2 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB2();
}
}
public class TestClient {
public static void main(String[] args) {
AbstractFactory factory1 = new ConcreteFactory1();
ProductA productA = factory1.createProductA();
productA.show();
ProductB productB = factory1.createProductB();
productB.show();
}
}
已知应用
java 的 AWT 中的 Button 和 Text 等。
相关模式
抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建 。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、有效率。
参考资料
- 《
Head First
设计模式》 - 图说设计模式
- Java设计模式:23种设计模式全面解析(超级详细)