抽象工厂模式
抽象工厂是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。
问题
当你想要使你的客户端与创建的对象完全解耦,你不希望了解具体产品的细节以及它的具体实现类。同时所有的可能的产品拥有多种不同的变体形成了多个系列的产品。
解决方案
抽象工厂模式为所有可能的产品根据类别声明了不同的接口(比如桌子、椅子等),每个具体的产品都会实现声明的接口。同时还声明了抽象工厂类,这里面定义了若干获取前面声明的不同接口的产品的方法(比如创建桌子、创建椅子等)。基于这个抽象工厂类和产品的某一方面特性(风格、品牌等)定义出具体生产具体产品的工厂类,一个具体实现的工厂类只产出对应特性的产品。
对于用户,无需关注生产产品的工厂类,也无需关注生产的产品的具体实现类,用户直接面向抽象工厂,提出自己的诉求,获取到返回的产品的接口类(比如桌子、椅子等)。用户使用自己持有的这些接口对象,执行产品的功能(比如坐下等)。
优点
- 你可以确保同一工厂生成的产品相互匹配。
- 你可以避免客户端和具体产品代码的耦合。
- 单一职责原则。 你可以将产品生成代码抽取到同一位置, 使得代码易于维护。
- 开闭原则。 向应用程序中引入新产品变体时, 你无需修改客户端代码。
缺点
- 由于采用该模式需要向应用中引入众多接口和类, 代码可能会比之前更加复杂。
模式结构图
实例
1 | public abstract class AbstractFactory { |
适用场景
- 客户端在使用前无法得知将要使用的具体实现类
- 客户端基于未来扩展性的考虑不希望直接调用具体实现类
- 需要的产品的维度超过一个,即不只是要椅子,要的是某种类型的椅子