您的位置:

抽象工厂模式介绍

一、什么是抽象工厂模式

抽象工厂模式(Abstract Factory)是一种创建型设计模式,它允许客户端创建一组相关或依赖对象的分组,而无需指定它们具体的类。这是通过提供一个接口来创建一组相关对象,而不是通过直接实例化的方式来实现的。

二、抽象工厂模式实现

抽象工厂模式实现有以下几个关键角色:

  • 抽象工厂(Abstract Factory):定义了一个用于创建一系列相关或相互依赖对象的接口。
  • 具体工厂(Concrete Factory):实现抽象工厂接口,具体负责创建产品对象。
  • 抽象产品(Abstract Product):定义了产品对象的接口,为各种具体产品提供统一的抽象。
  • 具体产品(Concrete Product):实现抽象产品接口,定义了具体产品的属性和功能。
以下是使用抽象工厂模式创建一组相关对象的代码示例:
// 抽象工厂接口
interface AbstractFactory {
  createProductA(): AbstractProductA;
  createProductB(): AbstractProductB;
}

// 具体工厂,创建一组具体产品
class ConcreteFactory1 implements AbstractFactory {
  createProductA(): AbstractProductA {
    return new ConcreteProductA1();
  }
  createProductB(): AbstractProductB {
    return new ConcreteProductB1();
  }
}

class ConcreteFactory2 implements AbstractFactory {
  createProductA(): AbstractProductA {
    return new ConcreteProductA2();
  }
  createProductB(): AbstractProductB {
    return new ConcreteProductB2();
  }
}

// 抽象产品接口
interface AbstractProductA {
  methodA(): void;
}

interface AbstractProductB {
  methodB(): void;
}

// 具体产品实现
class ConcreteProductA1 implements AbstractProductA {
  methodA(): void {
    console.log('具体产品A1的方法A');
  }
}

class ConcreteProductA2 implements AbstractProductA {
  methodA(): void {
    console.log('具体产品A2的方法A');
  }
}

class ConcreteProductB1 implements AbstractProductB {
  methodB(): void {
    console.log('具体产品B1的方法B');
  }
}

class ConcreteProductB2 implements AbstractProductB {
  methodB(): void {
    console.log('具体产品B2的方法B');
  }
}

// 客户端代码示例
class Client {
  private abstractProductA: AbstractProductA;
  private abstractProductB: AbstractProductB;

  constructor(factory: AbstractFactory) {
    this.abstractProductA = factory.createProductA();
    this.abstractProductB = factory.createProductB();
  }

  run(): void {
    this.abstractProductA.methodA();
    this.abstractProductB.methodB();
  }
}

const client1 = new Client(new ConcreteFactory1());
client1.run();

const client2 = new Client(new ConcreteFactory2());
client2.run();
我们定义了一个抽象工厂接口和四个具体的类,它们分别是两个具体工厂类和两个具体产品类。我们通过客户端代码调用不同的具体工厂创建一组相关的具体产品并使用它们的方法。

三、抽象工厂模式的优缺点

优点:

  • 抽象工厂模式将对象的创建和使用分离开来,客户端无需知道具体产品的类名,可以使用相同的代码处理不同的产品。
  • 抽象工厂模式可以保证一组产品的完整性,避免了应用程序使用不完整的产品组合。
  • 抽象工厂模式支持开闭原则,可以在不影响客户端代码的情况下增加新的产品族。

缺点:

  • 抽象工厂模式在添加新产品族时需要修改抽象工厂接口及其所有实现类,可能会导致一定的代码繁琐度和系统的复杂度。
  • 抽象工厂模式对于产品族中扩展新产品的需求支持不够灵活,可能需要更改所有已有的代码,应该避免频繁的产品扩展。

四、抽象工厂模式的适用场景

  • 一个系统需要多个产品系列,而这些产品系列之间具有相关性或依赖性。
  • 系统最终需要使用的产品族对象是由输入决定的。
  • 客户端代码不应依赖于具体产品类,而是应该使用抽象工厂接口和抽象产品接口。
  • 需要遵循开闭原则,增加新的产品族应该对系统的其他部分没有影响。

五、总结

抽象工厂模式是一种创建型设计模式,允许客户端使用一组相关或依赖的对象,而无需指定具体的类。它通过提供一个接口来创建一组相关的对象,而不是通过直接实例化的方式来实现这一目的。

抽象工厂模式最重要的角色是抽象工厂和具体工厂,它们分别负责定义创建产品的接口和创建一组具体产品。而抽象产品和具体产品则负责定义产品功能和实现这些功能。

抽象工厂模式的优点包括对象的创建与使用的解耦,保证产品的完整性和开闭原则的支持等。然而,它也存在修改抽象工厂和改动全部实现类的缺点,对于频繁的产品扩展需要慎重使用。