1 简单工厂
简单工厂模式是可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类,因为是通过静态方法返回一个具体的实例对象,所以它也称为静态工厂模式。这种模式的角色有:
- 抽象产品:一个
- 具体产品:一个或多个
- 具体工厂:一个
2 工厂方法
工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类。这种模式有四种角色:
- 抽象产品:一个
- 具体产品:不止一个,它与具体工厂相对应,由具体工厂产生,
- 抽象工厂:一个
- 具体工厂:不止一个,它与具体产品相对应,创建具体产品
简单工厂和工厂方法的比较:
简单工厂模式的最大优点在于工厂类中包含了必要的判断逻辑,根据方法参数类型动态选择实例化哪个对象,对于客户端来说去除了具体产品的依赖;而工厂方法模式实现时,客户端需要决定需要实例化哪一工厂来实现产品类,也就是工厂方法把简单工厂的内部逻辑判断移动到了客户端代码中了。
3 抽象工厂
抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。这种模式具有四种角色:
- 抽象产品:不止一个
- 具体产品:不止一个,由具体工厂产生,但是这个具体工厂不止生产这个具体产品,还生产其他具体产品
- 抽象工厂:只有一个
- 具体工厂:不是创建一个产品,而是创建一族产品
UML类图为:
抽象工厂模式最大的好处是易于交换产品系列,只需替换具体的工厂类即可;另外,它让具体的创建实例过程与客户端分离,客户端通过抽象接口操纵实例,产品的具体类名也被具体工厂实现分离,不会出现在客户端代码中。
抽象工厂相比于工厂方法,它进一步抽象的是什么呢?在我看来,抽象的是不同抽象产品的具体产品,也就是图中A1, B1 和 A2, B2,由于A1, B1 可能是使用同种技术生产的产品,具有某种相似性,因此可以进一步抽象,那这种抽象就需要具体的抽象工厂来进行封装,也就是来自同一具体工厂的不同产品使用的技术是一样的。