0%

抽象工厂模式

抽象工厂模式

抽象工厂是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。

问题

当你想要使你的客户端与创建的对象完全解耦,你不希望了解具体产品的细节以及它的具体实现类。同时所有的可能的产品拥有多种不同的变体形成了多个系列的产品。

解决方案

抽象工厂模式为所有可能的产品根据类别声明了不同的接口(比如桌子、椅子等),每个具体的产品都会实现声明的接口。同时还声明了抽象工厂类,这里面定义了若干获取前面声明的不同接口的产品的方法(比如创建桌子、创建椅子等)。基于这个抽象工厂类和产品的某一方面特性(风格、品牌等)定义出具体生产具体产品的工厂类,一个具体实现的工厂类只产出对应特性的产品。

对于用户,无需关注生产产品的工厂类,也无需关注生产的产品的具体实现类,用户直接面向抽象工厂,提出自己的诉求,获取到返回的产品的接口类(比如桌子、椅子等)。用户使用自己持有的这些接口对象,执行产品的功能(比如坐下等)。

优点

  • 你可以确保同一工厂生成的产品相互匹配。
  • 你可以避免客户端和具体产品代码的耦合。
  • 单一职责原则。 你可以将产品生成代码抽取到同一位置, 使得代码易于维护。
  • 开闭原则。 向应用程序中引入新产品变体时, 你无需修改客户端代码。

缺点

  • 由于采用该模式需要向应用中引入众多接口和类, 代码可能会比之前更加复杂。

模式结构图

实例

完整代码地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public abstract class AbstractFactory {
public abstract PC getPC();
public abstract Phone getPhone();
}

public class AppleFactory extends AbstractFactory {

@Override
public PC getPC() {
return new Mac();
}

@Override
public Phone getPhone() {
return new IPhone();
}
}

适用场景

  • 客户端在使用前无法得知将要使用的具体实现类
  • 客户端基于未来扩展性的考虑不希望直接调用具体实现类
  • 需要的产品的维度超过一个,即不只是要椅子,要的是某种类型的椅子