设计模式与前端:优缺点以及使用场景(六)| 青训营

92 阅读2分钟

4:抽象工厂模式

在理解抽象工厂模式前,先要明确两个概念:

产品族:一个工厂下的所有产品

产品等级:多个工厂下的同一类产品

image.png


抽象工厂模式(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:三种工厂模式的简单对比

简单工厂:传入指定类型,生产对应产品。 只有一个工厂,生产多种产品。一对多

工厂方法:特定工厂生产特定产品,每个工厂只能生产一种产品。一对一

抽象工厂:每个工厂可以生产多种产品,每种产品可以被多个工厂生产。多对多