全部博文(695)
分类: Java
2017-03-17 15:21:33
简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性
简单工厂
简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。不修改工厂类的代码的话,是无法扩展的。
UML类图如下:
《大话设计模式》中的一个例子
代码如下:
点击(此处)折叠或打开
客户端调用工厂的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