码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式------工厂三姐妹

时间:2014-05-31 17:40:03      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:c   style   blog   a   http   ext   

      设计模式学完了,我是按照大话书上的顺序一个一个学习的,其中有三个模式名称中含有“工厂”这两个字眼,而且都属于创建型,它们就是“工厂三姐妹”,下面我们通过计算器的示例来好好认识一下这姐妹三儿。

简单工厂模式:

bubuko.com,布布扣

简单工厂类中的代码:

bubuko.com,布布扣

       从中我们可以看到,当用户请求进行加法运算时,只需operationFactory.createOperate("+"),工厂就会自动给出一个加法类的实例,用户根本不用和具体的运算类打交道,对象的创建过程被封装起来了。但是如果我们要添加一个幂运算,不仅要在运算类下添加幂运算的子类来扩展,还需要改动工厂类,添加新的case,这样对修改也开放了。简单工厂模式就是因为违背了开闭原则,而不能算得上一个真正的设计模式。当工厂类负责创建的对象比较少且不再增减,客户只知道传入工厂类的参数的情况下,使用简单工厂模式是个不错的选择。

工厂方法模式:

bubuko.com,布布扣

同简单工厂模式相比,我们能清晰地看到工厂类下多了具体运算的工厂子类,工厂类接口的任务不那么繁重了,只有一个创建抽象产品的方法:

bubuko.com,布布扣

        所有生产具体产品类的工厂,都要实现这个接口。客户端的代码变成了这样的:

IFactory operFactory=new AddFactory();Operation oper=operFactory.CreateOperation();

       这样就让子类去决定实例化具体的类了,分工更细了,责任到人。这时候,我们要添加幂运算只需在工厂类和运算类下分别扩展一下,而不用修改代码了,弥补了简单工厂模式的不足之处。

       当需要生产一系列的产品时,比如说有两种级别的计算器,一种是我们常见的算术型计算器,一种是科学型计算器,它们都能计算加减乘除,而工厂方法模式实现的只是一种计算器。这个时候,就要用抽象工厂模式了,真可谓山外有山,人外有人。

抽象工厂模式:

bubuko.com,布布扣

(自己举得例子,有不妥之处,请谅解)

        这样一来,客户可以更换产品的系列,想要算术型计算器,IFactory=new  ArithmeticFactory(),想要科学型的,IFactory=new  ScienceFactory()。工厂方法模式与抽象工厂模式的区别其实就是两句话:前者只有一个抽象产品类,而后者有多个。前者的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

纵观这三种模式,长江后浪推前浪。但不要以为抽象工厂模式就很完美了,当我们要添加乘法运算呢?不仅有扩展还有改动。学习要灵活,这三姐妹可以互相帮助呀,可以让简单工厂模式来改进抽象工厂模式。其实在所有用到简单工厂的地方,都可以考虑反射技术来去除switch或if,解除分支判断带来的耦合。办法总比困难多的。

这姐妹三儿就介绍到这儿了,今天先混个脸熟,以后打交道的日子多着呢。




设计模式------工厂三姐妹,布布扣,bubuko.com

设计模式------工厂三姐妹

标签:c   style   blog   a   http   ext   

原文地址:http://blog.csdn.net/cyl_happygirl/article/details/27353641

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!