抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种将一组相关的工厂方法封装在一起以创建对象的方式。抽象工厂模式的核心思想是创建一组相关的对象,而无需暴露对象的创建细节。它通过定义一组工厂接口和一组相关产品接口,允许客户端代码以通用的方式创建一组相关的对象。
场景
创建一组相关的产品:当需要创建一组相互关联的产品,例如不同操作系统的用户界面组件(按钮、文本框、窗口等)时,抽象工厂模式可以提供一种一致的方式来创建这些产品。
隐藏对象的创建细节:抽象工厂模式将对象的创建细节封装在工厂方法内,从而隐藏了对象的具体实现,使客户端代码不必关心具体对象的创建方式。
支持产品族的变化:当需要支持不同产品族的变化(例如,切换主题或风格时),抽象工厂模式允许你轻松切换整个产品族,而不需要修改客户端代码。
实现
// 抽象工厂接口
class AbstractFactory {
createProductA() {}
createProductB() {}
}
// 具体工厂1,创建产品A1和产品B1
class ConcreteFactory1 extends AbstractFactory {
createProductA() {
return new ProductA1();
}
createProductB() {
return new ProductB1();
}
}
// 具体工厂2,创建产品A2和产品B2
class ConcreteFactory2 extends AbstractFactory {
createProductA() {
return new ProductA2();
}
createProductB() {
return new ProductB2();
}
}
// 抽象产品A
class AbstractProductA {}
// 具体产品A1
class ProductA1 extends AbstractProductA {
display() {
console.log("Product A1");
}
}
// 具体产品A2
class ProductA2 extends AbstractProductA {
display() {
console.log("Product A2");
}
}
// 抽象产品B
class AbstractProductB {}
// 具体产品B1
class ProductB1 extends AbstractProductB {
display() {
console.log("Product B1");
}
}
// 具体产品B2
class ProductB2 extends AbstractProductB {
display() {
console.log("Product B2");
}
}
// 使用抽象工厂创建产品
function clientCode(factory) {
const productA = factory.createProductA();
const productB = factory.createProductB();
productA.display();
productB.display();
}
// 使用具体工厂1创建产品
const factory1 = new ConcreteFactory1();
clientCode(factory1);
// 使用具体工厂2创建产品
const factory2 = new ConcreteFactory2();
clientCode(factory2);
在上面的示例中,AbstractFactory 是抽象工厂接口,它定义了创建产品 A 和产品 B 的方法。ConcreteFactory1 和 ConcreteFactory2 是具体工厂类,它们实现了抽象工厂接口,并负责创建不同系列的产品。AbstractProductA 和 AbstractProductB 是抽象产品接口,定义了产品的通用行为。具体产品类 ProductA1、ProductA2、ProductB1 和 ProductB2 实现了这些抽象产品接口。
客户端代码可以使用抽象工厂来创建产品,而不必关心具体工厂和产品的创建过程。这使得客户端代码更具灵活性,能够轻松切换不同系列的产品。抽象工厂模式的主要优点是能够支持产品族的变化,同时保持客户端代码的独立性。