`
Severus-zhang
  • 浏览: 4752 次
  • 性别: Icon_minigender_1
  • 来自: 长沙->北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

设计模式之简单工厂,工厂方法,抽象工厂

阅读更多

          最近学习了设计模式中的工厂系列,简介如下:

     简单工厂,工厂方法与抽象工厂都属于创建型设计模式,把工厂生产品类比于程序中创建对象,从名字我们也可以猜出,这三类设计模式主要与对象的创建有关。

在实际创建对象的过程中,我们可以很实际的直接使用new关键字来创建对象,但是当一个类中多次使用到其它类的时候,每次都new一个相应的对象,并进行初始化,事情就会变得复杂。思考初级阶段做过的画板和线程游戏,我们就能想到改进之处。简而言之,代码的逻辑处理模块堆叠在一起时,当我们试图理清逻辑,将他们拆分成彼此没有联系,或是联系明晰的模块时,就会出现困难,而这些,正是创建型设计模式的关注方向。

简单工厂,就是将产品对象的创建从程序代码中复杂的处理模块中分离出来,定义一个具体的工厂类,专门负责具体产品对象的创建。这些产品对象一般继承自同一父类,或实现同一接口,具有公共的方法。

以一个画图板程序为例,如果使用简单工厂来创建形状对象,其结构图如下:



   

在简单工厂中,通过工厂来创建形状对象,通过传入类型参数来决定具体创建哪种形状的对象。由此,在监听器模块中,就可以直接调用DrawFactory来创建对象,并调用形状对象的画图方法画图。判断逻辑模块因此得到简化,代码实现复用。

 

工厂方法:

工厂方法在简单工厂基础之上,比如,当我们出行时,需要决定是坐汽车,火车,还是轮船。当我们要创建的产品复杂度类似于造一辆汽车这种级别时,定义一个什么都造的具体工厂显然是不现实的,这时,可以使用工厂方法来尝试解决问题。

工厂方法在简单工厂基础上,定义一个工厂接口,对工厂进一步抽象。当需要创建子类类型的对象时,由具体子类的实现工厂来专门生产具体子类的对象。比如,当我们出行需要具体交通工具时,需要汽车,就会使用汽车工厂生产的汽车,需要轮船,就使用造船厂生产的轮船。由具体的子类工厂来生产具体的子类。

简单工厂与工厂方法的对比结构图如下:


简单工厂

 

工厂方法:



  

使用工厂方法,就是使用具体的子类产品工厂来生产具体的子类产品,在实现类工厂中决定如何来创建对象。

 

抽象工厂:定义一个可以产生一系列相互关联的产品的抽象工厂类,不同的子类工厂实现抽象工厂类,生产该系列产品。与工厂方法相比,功能上更加抽象。

比如我们常用的桌面主题,就可以看成是抽象工厂模式的一个实用。当我们使用了某个主题包时,电脑的桌面按钮,图标,启动栏,任务栏的界面风格全部被替换。

我们可以认为原来电脑的桌面上每个按钮都来自于一个组件工厂,该组件工厂生产启动栏,任务栏等按钮。当我们使用新的组件工厂时,新的组件工厂也生产相应的组件,只是风格不同,当我们安装新的主题时,整个桌面的组件系列被完整替换。

当需要产生一个产品系列时,就需要定义一个可以生产该产品系列的抽象工厂类,然后由子类的实现工厂来生产实际的产品系列。



   

使用抽象工厂,便于替换整个产品系列。

     

    简单工厂,工厂方法和抽象工厂所体现的类结构还是很清晰的,但是项目经验的丰富与否,感受就会不同,就我自己而言,项目经验不多,感觉与其绞尽脑汁去生搬硬套举例子,陷入优缺点,适用类型的比较中,不如分析以往的代码,在项目中实用,积累经验,加深理解。去除虚伪的浮躁,坦荡的面对自己愚钝与脆弱,行动吧。 

    

 

 

  • 大小: 26 KB
  • 大小: 6.7 KB
  • 大小: 13.3 KB
  • 大小: 26.1 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics