[Design] Factory Pattern

创建模式是对类的实例化过程的抽象化,分为类的创建模式和对象的创建模式。
类的创建模式
  使用继承关系把类的创建过程延迟到子类,从而封装了客户端将得到哪些具体类的信息,并且隐藏了这些类的实例是如何创建和组合在一起的。
对象的创建模式
      把对象的创建过程动态的委派给另一个对象,从来动态的决定客户端将得到哪些具体类的实例,以及这些类是实例是如何创建和组合在一起的。
 
1.简单工厂模式
  简单工厂模式是类的创建模式(静态工厂方法模式Static Factory Method),  是由一个工厂对象决定创建出哪一种产品类的实例。
  工厂是此模式的核心,它对客户封装了具体产品实例的创建过程,从而实现对责任的分割。但如果产品有复杂的多层结构时,工厂只有自己来负责所有产品的创建逻辑,形成一个无所不知的全能类。如果此类出问题整个系统都会受到影响。

  优点:客户端相对独立于产品的创建过程,引入一款新产品时客户端无需修改。支持开闭原则。
  缺点:对开闭原则支持不够。每引进一款产品,都要修改工厂对象。

简单工厂模式结构


  •      1、工厂类角色

    担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体类实现。

  •     2、抽象产品角色

    担任这个角色的类是工厂方法模式所创建对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个接口或者抽象类实现。

  •     3、具体产品角色

    工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体类实现。
 
2.工厂方法模式
   工厂方法模式是类的创建模式,又叫做虚拟构造子模式或多态性工厂模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建过程推延到子类中去。
 优点:工厂方法比简单工厂更进了一步,将工厂角色抽象化产生出具体工厂角色,这样增加新的产品时,只需要增加对就产品类和具体工厂角色。
 缺点:工厂方法模式主要解决面对一个产品等级结构的问题。如果面对多个产品等级结构,工厂方法会产生多个对应工厂等级结构。随着产品等级结构的增加,会产生出太多相似的工厂等级结构。显示不是我们想要的结果。

工厂方法模式结构


  •     1、抽象工厂角色

    这个角色是工厂模式的核心,它与应用程序逻辑无关。具体工厂角色实现这个接口。抽象工厂角色一般由接口或抽象类实现。

  •     2、 具体工厂角色

    实现抽象工厂角色接口,与应用程序逻辑密切相关,由应用程序调用来创建产品对象。一般由具体类来实现。

  •     3、抽象产品角色

    产品对象共同拥有的接口。一般由接口或抽象类实现。

  •   4、具体产品角色

    实现抽象产品角色所声明的接口,工厂方法模式所创建的每一个对象都是某个具体产品角色实例。一般由具体类实现。
 
3.抽象工厂模式
  抽象工厂模式是对象的创建模式,是工厂方法模式的进一步推广。
  抽象工厂模式是所有形态工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式的用意是:向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象。
  抽象工厂模式主要解决面对多个产品等级结构的问题。比工厂方法模式更进一层。
优点:增加新的产品族,只需要增加对就具体工厂类。
缺点:增加新的产品等级结构时,要修改所有工厂类,给每个工厂类都增加一个新的工厂方法。

抽象工厂模式结构


  •     1、抽象工厂角色

    这个角色是模式的核心,它与应用系统逻辑无关。具体工厂角色必须实现这个接口。抽象工厂角色一般由接口或抽象类实现。

  •     2、具体工厂角色

    这个角色在客户端调用下创建产品的实例。含有选择合适的产品对象的逻辑,与应用系统的商业逻辑密切相关。一般由具体类实现。

  •     3、抽象产品角色

    模式创建产品对象共同拥有的接口。一般由接口或抽象类实现。

  •   4、具体产品角色

    模式所创建的任何产品对象都是某一具体产品类的实例。这是客户端最终需要的东西,内部一定充满了应用程序的商业逻辑。一般由具体类实现。
使用情形:
1. 一个系统不应该依赖产品类如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
2. 系统的产品有多于一个产品族,而系统只消费其中某一族的产品。这是抽象工厂模式的用意。
3.同属于同一产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
4.系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。

原文地址:https://www.cnblogs.com/abeen/p/1397553.html