“妞”太多,如何管理?—— 三种创建型设计模式

摘要:
每个男程序员可能都会梦想自己有很多妞,其实你真的有很多“妞”,这个“妞”就是“new”!代码中我们经常需要new各种对象,new太多了,代码混乱不好用而且不好维护,如何才能管理好这些“妞”呢?本文将为你介绍设计模式中的其中三种创建型模式。

作者
张传波
www.umlonline.org/school/

作者自述:
在高中时已经很喜欢coding,可惜没有考上计算机相关的大学专业,但仍然偏执于写程序,毕业后做了几年的程序员,后来成为项目经理直到常务副总。熟悉的语言有Basic、VB、C#,一直遗憾的事情是没有花时间去精通C++。很早就“看中”设计模式,但直到现在仅能在实际工作中实践过其中几种设计模式。所以,本文欢迎各位高手拍砖!

 

一、简单工厂(不是模式的模式)

 

如果在代码中经常要重复写这段代码,实在不太爽:
if (…...)
newObject = new TypeA(); //TypeA TypeB的父类一样。
else if (…...)
newObject = new TypeB(); //TypeA TypeB的父类一样。
……

你考虑怎样改进?

这样可不简单!用一个静态方法,根据传入参数返回所需的对象便可,在每个需要用到这个对象的地方,这样写便可:
Object newObject = ObjectBuilder.CreateObject(string type);

类图如下:

简单工厂1.png



以上这个设计就是简单工厂,简单工厂不是23种模式中的一种,但在我们实际工作中经常会用到,简单工厂是管理new的最常见方法。

在程序中new对象一般没有这样简单,往往要根据不同的情况new不同的对象,并且要初始化对象,我们往往将这些工作“包装”到某个方法里面,通过这个方法直接得到需要的对象。

 

二、工厂方法(Factory Method Pattern)

 

我在实际工作中还没有用过工厂方法,下面简单谈谈我的理解,供大家参考。

类图

工厂方法1.png



这个图一下子不太好理解,我们先回顾一下简单工厂,简单工厂是通过一个方法来包装new对象的动作,如果我们将new对象的动作包装到一个类中,那么这个类就可以看成是一个工厂,该工厂专门用来产生某些对象的。

有时候我们希望能生产苹果、西瓜、葡萄等不同品种的水果,这样一个工厂就不能满足要求,我们需要分别做出苹果工厂、西瓜工厂、葡萄工厂,需要苹果时就调用苹果工厂的CreateProduct()就搞定了。

但问题来了,我们希望程序不需要管是苹果工厂还是西瓜工厂,总之是工厂就行了。这样我们就需要将这些苹果工厂、西瓜工厂、葡萄工厂抽象为水果工厂了,就好像上图中的ProductA_Factory,ProductB_Factory继承了抽象类Factory。

上图中无论是哪个工厂,生产的都是Product,Product、Factory已经被抽象,而ProductA_Factory实际生产的是ProductA1、ProductA2,ProductB_Factory实际生产的是ProductB1、ProductB2,注意上图中用了相同的颜色来表示哪个工厂生产哪些产品。

 

三、抽象工厂(Abstract Factory Pattern)简介

 

我在实际工作中我也没有用过抽象工厂,下面简单谈谈我的理解,供大家参考。

类图

抽象工厂1.png



说明:图中黄底色文字不是类图的一部分,仅是用来说明的。

有时候我们希望能得到一系列对象,不是一个对象,这时我们可考虑用抽象工厂,抽象工厂中有多个方法,分别得到不同的对象。
如果仅是这样,我们不需要对工厂进行抽象,抽象工厂模式中要将工厂及产品都定义为接口,其目的就是如果程序想不加区别地得多个不同系列的对象,这时就需要实现这些接口。

接口Factory定义了产生ProductA、ProductB的方法,如果需要产生更多的产品,可定义更多的方法。
ConcreteFactory1实现了Factory接口,该类专门生产ConcreteProductA1、ConcreteProductB1产品;同理ConcreteFactory2专门生产ConcreteProductA2、ConcreteProductB2产品。
这些具体工厂和产品都是实现了Factory、ProductA、ProductB接口的,故程序可以不加区别地处理。

 

电子书《硬啃设计模式》下载

本书介绍了我对23种设计模式的粗浅理解,本文的内容来自书中,有时间再分享更多书中内容。

以下是封面和部分目录:

封面.png



目录.png


猛点以下链接直接下载电子书:
http://www.umlonline.org/school/attachment.php?aid=MTkxMXxlOWJlOTA2MHwxMzM2NjU2Mzc2fGQ0MDl4WWFwb1NUZU1EZWlMRzZmM1FTSW9MVWJWSnVYTGNid0ZnY24yYjM0Mmtn

 

如果本文对你有帮助,麻烦点击一下“推荐”,谢谢!

 

 

posted on 2012-05-15 12:29  张传波(Fireball)  阅读(3304)  评论(11编辑  收藏  举报