4:抽象工厂模式
在理解抽象工厂模式前,先要明确两个概念:
产品族:一个工厂下的所有产品
产品等级:多个工厂下的同一类产品
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
// 抽象工厂类
class AbstractFactory {
createProductA() {
throw new Error('This method should be overridden.');
}
createProductB() {
throw new Error('This method should be overridden.');
}
}
// 具体工厂类
class ConcreteFactory1 extends AbstractFactory {
createProductA() {
return new ProductA1();
}
createProductB() {
return new ProductB1();
}
}
class ConcreteFactory2 extends AbstractFactory {
createProductA() {
return new ProductA2();
}
createProductB() {
return new ProductB2();
}
}
// 具体产品类
class ProductA1 {
constructor() {
this.name = 'Product A1';
}
}
class ProductB1 {
constructor() {
this.name = 'Product B1';
}
}
class ProductA2 {
constructor() {
this.name = 'Product A2';
}
}
class ProductB2 {
constructor() {
this.name = 'Product B2';
}
}
// 使用抽象工厂创建产品
const factory1 = new ConcreteFactory1();
const productA1 = factory1.createProductA();
console.log(productA1.name); // 输出: Product A1
const productB1 = factory1.createProductB();
console.log(productB1.name); // 输出: Product B1
const factory2 = new ConcreteFactory2();
const productA2 = factory2.createProductA();
console.log(productA2.name); // 输出: Product A2
const productB2 = factory2.createProductB();
console.log(productB2.name); // 输出: Product B2
优点:
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:
规定了所有可能生产的产品集合,但是如果你要生产一个C,就需要修改抽象工厂的接口比较麻烦,增加了系统的抽象性和理解难度。
虽然三种工厂模式各不相同,但是它们都有一个共同的目的---解耦。
5:三种工厂模式的简单对比
简单工厂:传入指定类型,生产对应产品。 只有一个工厂,生产多种产品。一对多
工厂方法:特定工厂生产特定产品,每个工厂只能生产一种产品。一对一
抽象工厂:每个工厂可以生产多种产品,每种产品可以被多个工厂生产。多对多