`
zhunmumu
  • 浏览: 28732 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java设计模式学习笔记(二)--工厂方法模式

 
阅读更多

工厂方法模式:就是定义一个创建产品对象的工厂接口,让子类决定实例化哪一种

实例对象,也就是将实际创建实例对象的工作推迟到子类当中,核

心工厂类不再负责具体产品的创建。

我们可以这样理解工厂方法模式:由一个抽象工厂定义了创建产品的接口,但是

具体是哪一种产品抽象工厂是不知道的,产品的实例化工作被推迟到了具体工厂中。

在这一系列的变化过程中,应用的是程序设计语言中的多态方式,使用接口调用

对象实例的具体方法,获得不同对象的内容,而对外部是表现一致的(相同的方法),

这也是面向接口编程的有点。

像这样不在工厂中产生的对象实例,而是将实例化的工作推迟到工厂子类中,这种

模式被称做工厂方法模式。


工厂方法模式有如下角色:
抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。
抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。
具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

实例:造车工厂会造拖拉机,汽车,火车,在一个工厂里明显不能完成,在现实世界中,一定是有自己独立的工厂来做。因为我们知道拖拉机,汽车,火车有很多共性也有很大差异,共性还是车,肯定都是重工生产,需要钢材,车床加工,都需要动力,都有座椅,车灯等等,那差异就多了,动力不同,火车可能是电动力,汽车是汽油,拖拉机是柴油等等。我们利用工厂方法来抽象这个造车工厂的模型如下:

设计原则:
(1)“开-闭”原则:一个软件实体应对扩展开放,对修改关闭。我
们在设计软件模块的时候应该使这个模块可以在不被修改的前
提下被扩展。
(2) 依赖倒置原则:不论工厂还是产品都应该依赖于抽象,而不是
具体的实体类。

使用场合:
(1)当子类型可能会有很多,以后需要不断增添不同的子类实现时;
(2)当一个系统尚在框架设计阶段,还不知道将来需要实例化哪些具
体类时;
(3)系统设计之初不需要具体对象的概念(或者说没有具体对象的概

念)

工厂方法模式优缺点:

 

优点:

(1)在工厂方法中,用户只需要知道所要产品的具体工厂,无须关系

具体的创建过程,甚至不需要具体产品类的类名。

(2)在系统增加新的产品时,我们只需要添加一个具体产品类和对应

的实现工厂,无需对原工厂进行任何修改,很好地符合了“开闭原则”。

缺点:

1)每次增加一个产品时,都需要增加一个具体类和对象实现工厂,是的

系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时

也增加了系统具体类的依赖。这并不是什么好事。

 

工厂

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics