Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1615076
  • 博文数量: 695
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4027
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-20 21:22
文章分类

全部博文(695)

文章存档

2018年(18)

2017年(74)

2016年(170)

2015年(102)

2014年(276)

2013年(55)

分类: Java

2017-03-17 15:21:33

简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性

简单工厂 

简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例不修改工厂类的代码的话,是无法扩展的。

UML类图如下:

 

 

《大话设计模式》中的一个例子

代码如下:

点击(此处)折叠或打开

  1. public static Operation createOperate(string operate)
  2.     {
  3.         Operation oper = null;
  4.         switch (operate)
  5.         {
  6.             case "+":
  7.                 {
  8.                 oper = new OperationAdd();
  9.                 break;
  10.                 }
  11.             case "-":
  12.                 {
  13.                 oper = new OperationSub();
  14.                 break;
  15.                 }
  16.             case "*":
  17.                 {
  18.                 oper = new OperationMul();
  19.                 break;
  20.                 }
  21.             case "/":
  22.                 {
  23.                 oper = new OperationDiv();
  24.                 break;
  25.                 }
  26.         }
  27.         return oper;
  28.     }
  29.     }


客户端调用工厂的reateOperator("/"),就能返回除法运算符。
  优点:客户端不需要修改代码。
  缺点: 当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类switch判断,违反了开闭原则。

 

工厂方法 

工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。在同一等级结构中,支持增加任意产品。

UML类图如下:

客户端使用的代码如下:

 

需要显示的指定使用生成要使用的工厂类。

这个和简单工厂有区别,简单工厂模式只有一个工厂,根据用户输入的参数不同生成不同的类;而工厂方法模式对每一个产品都有相应的工厂,需要用户显示生成需要的类。 

好处:增加一个运算类(例如N次方类),只需要增加运算类和相对应的工厂,两个类,不需要修改工厂类。 

缺点:增加运算类,会修改客户端代码,工厂方法只是把简单工厂的内部逻辑判断移到了客户端进行

 这里感觉工厂模式有点“多次一举”,为什么非要在运算类的基础上封装一层工厂类,直接在客户端引用运算抽象类,想使用哪种运算的时候直接new哪种就可以了,当新增一个运算类的时候,也不需要改变原有代码

 

抽象工厂模式: 

UML类图如下:

 

客户端调用代码如下:

 

个人感觉是和工厂模式没有本质区别,只是工厂模式是针对一款产品,而抽象工厂模式是针对一个产品族(这个例子中是产品族内包含了user和的department两个产品) 

优点:易于交换产品系列,例如Access和SQLServer数据库之间切换。
  缺点:例如增加一个新的产品boss,不仅需要添加 IBoss类、SqlserverBoss和AccessBoss类,还要在工厂类IFactory中添加接口并在SqlserverFactory和AccessFaCtory添加boos方法的实现

小结 

工厂模式中,重要的是工厂类,而不是产品类。产品类可以是多种形式,多层继承或者是单个类都是可以的。但要明确的,工厂模式的接口只会返回一种类型的实例,这是在设计产品类的时候需要注意的,最好是有父类或者共同实现的接口。

使用工厂模式,返回的实例一定是工厂创建的,而不是从其他对象中获取的。

工厂模式返回的实例可以不是新创建的,返回由工厂创建好的实例也是可以的。

 

区别 

简单工厂  用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)

工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)   
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)   


(大话设计模式中还有用简单工厂模式改进抽象工厂模式)
参考:
http://blog.csdn.net/superbeck/article/details/4446177
http://blog.chinaunix.net/uid-25958655-id-4243289.html

 

阅读(873) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~