推荐答案
// www.javascriptcn.com code example
// 抽象工厂接口
class AbstractFactory {
createProductA() {
throw new Error("This method must be overridden!");
}
createProductB() {
throw new Error("This method must be overridden!");
}
}
// 具体工厂1
class ConcreteFactory1 extends AbstractFactory {
createProductA() {
return new ProductA1();
}
createProductB() {
return new ProductB1();
}
}
// 具体工厂2
class ConcreteFactory2 extends AbstractFactory {
createProductA() {
return new ProductA2();
}
createProductB() {
return new ProductB2();
}
}
// 抽象产品A
class AbstractProductA {
use() {
throw new Error("This method must be overridden!");
}
}
// 具体产品A1
class ProductA1 extends AbstractProductA {
use() {
console.log("Using Product A1");
}
}
// 具体产品A2
class ProductA2 extends AbstractProductA {
use() {
console.log("Using Product A2");
}
}
// 抽象产品B
class AbstractProductB {
use() {
throw new Error("This method must be overridden!");
}
}
// 具体产品B1
class ProductB1 extends AbstractProductB {
use() {
console.log("Using Product B1");
}
}
// 具体产品B2
class ProductB2 extends AbstractProductB {
use() {
console.log("Using Product B2");
}
}
// 客户端代码
function clientCode(factory) {
const productA = factory.createProductA();
const productB = factory.createProductB();
productA.use();
productB.use();
}
// 使用具体工厂1
console.log("Client: Testing client code with the first factory type...");
clientCode(new ConcreteFactory1());
// 使用具体工厂2
console.log("Client: Testing client code with the second factory type...");
clientCode(new ConcreteFactory2());本题详细解读
抽象工厂模式简介
抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式通常用于处理产品族的创建,这些产品族中的产品是相互关联的。
代码结构解析
AbstractFactory:抽象工厂类,定义了创建产品的方法
createProductA和createProductB,这些方法需要在具体工厂中实现。ConcreteFactory1 和 ConcreteFactory2:具体工厂类,继承自
AbstractFactory,并实现了createProductA和createProductB方法,分别返回具体的产品对象。AbstractProductA 和 AbstractProductB:抽象产品类,定义了产品的接口
use,具体产品类需要实现这个接口。ProductA1, ProductA2, ProductB1, ProductB2:具体产品类,继承自抽象产品类,并实现了
use方法。clientCode:客户端代码,通过传入不同的工厂对象来创建不同的产品族,并调用产品的
use方法。
使用场景
抽象工厂模式适用于以下场景:
- 系统中有多个产品族,而每次只使用其中某一产品族。
- 系统需要提供一个产品类的库,所有产品以同样的接口出现,从而使客户端不依赖于具体实现。
优点
- 隔离了具体类的生成,客户端不需要知道具体产品的类名。
- 易于交换产品系列,只需改变具体工厂即可使用不同的产品配置。
- 有利于产品的一致性,一个产品族中的产品对象被设计成一起工作。
缺点
- 增加新的产品族比较困难,需要修改抽象工厂接口及其所有子类。
- 增加了系统的抽象性和理解难度。