现在的位置: 首页 > 综合 > 正文

设计模式-工厂方法

2017年10月09日 ⁄ 综合 ⁄ 共 1427字 ⁄ 字号 评论关闭
工厂方法(Factory Method)模式
    工厂方法模式是类的创建模式,又叫虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。
    工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际工作推迟到子类中。

工厂方法模式的引进
    工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。下面是工厂方法模式的缩略类图:
点击在新窗口查看全图


 
  
  在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做。这个核心工厂则变为抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一产品创建的细节。
    这种抽象的结果,使这种工厂方法模式可以用来允许系统不修改具体工厂角色的情况下引进新产品,这一特点无疑使得工厂模式具有超过简单工厂模式的优越性。

工厂方法模式的结构
    在工厂方法模式中,一般都有一个平行的等级结构,也就是说工厂和产品是对应的的。抽象工厂对应抽象产品,具体工厂对应具体产品。简单的示意图如下:
点击在新窗口查看全图
 
    
从上图可以看出,工厂方法模式的系统涉及到了以下角色:
    抽象工厂角色:与应用程序无关,任何在模式中创建对象的工厂必须实现这个接口。
    具体工厂角色:实现了抽象工厂接口的具体类,含有与引用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。
    抽象产品角色:工厂方法所创建产品对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
    具体产品角色:这个角色实现了抽象产品角色所声名的接口。工厂方法所创建的每个具体产品对象都是某个具体产品角色的实例。

模式名称:工厂方法模式

1.问题描述

生活场景:很多的公司都通过生产不同品牌的同一类产品来占有市场,比如,联合利华公司生产洗发水,开始只有“夏士莲”系列,后来为了在洗发水市场上扩充份额,又推出了“清扬”系列。你会发现,不管是“清扬”还是“夏士莲”,有着相同的功能——洗发,它们在生产的过程中也有很多共同的地方。

 

设计目的:实现对具有共性的产品的创建。

 

 

2.不假思索的思路

思路描述:在生产“夏士莲”洗发水的工厂里增加一条生产“清扬”洗发水的生产线,以实现“清扬”洗发水的生产。

 

 

类结构图

缺点:这样的设计,工厂类集中了所有的实例的创建逻辑,违反了单一职责原则,即每一个类都只负责一件具体的事情;同时,当产品不断增多时,可能会出现要求工厂类根据不同条件创建不同实例的需求,工厂类就无法满足需求,不利于后续的扩充和维护。

3.归纳阶段:

思路描述:通过工厂方法模式进行处理:为每种系列的产品建立属于自己的工厂,各种工厂之间是有共性的,可以继承一个抽象的工厂类;各种产品之间也是有共性的,可以继承一个抽象的产品类。

 

类结构图

设计体会

这样的设计降低了工厂类的内聚,满足了类之间的层次关系,又很好的符合了面向对象设计中的单一职责原则,即每一个类都只负责一件具体的事情。当有新的产品加入时,只需要分别继承抽象的工厂类和抽象的产品类,不会对其它产品有任何影响。

4.验证阶段

思路描述:结合上面的例子,增加一个洗发水产品:“力士”

 

类结构图

5.抽象描述

思路描述:把“共性”提取出来,根据各自的“个性”建立各自的继承共性的实现。

 

类结构图:

抱歉!评论已关闭.