Gof创建型设计模式-总结

序言:设计模式我相信已经有很多达人写过文章了,我也不详细一个一个的写,现在写的文章只是为自己的学习作一个总结和希望对这个有经验的达人能一起交流一下。

前提:我个人认为学习设计模式是需要有一定基础和经验的,需要有比较好的OO思想,一定的程序开发经验(就是做过的项目比较多)。我就是一个好好的例子,两年多之前我刚刚学习了asp.net(C#)半年,于是就气冲冲的走去看设计模式(呵呵,刚入门的程序员都是会有一个眼高手低的过程)。后来得出来的结论就是“设计模式”=“软件结构”,呵呵~之后还一直以为自己懂设计模式,有时还高声和人家讨论。但后来随着自己的见识广阔和经验增多,就开始觉的自己的理解有点问题。直到现在混了三年,决定重新看一次设计模式,果然和当初的认知有很大的差别。现在还挺为自己以前说过的言论感到羞愧的,呵呵~希望我以前没有误导那些新手...

资料:
我现在讲的是Gof模式,那当然是要看那本相当经典的书咯,《设计模式-可复用面向对象软件的基础》。但这本书要有一定基础的人才能看的懂,刚入门的新手先推荐你们看一些通俗易懂一点的资料。到懂了的时候再看这本经典之作会获益良多。

正文:一堆废话之后终于开始正文了。
我归纳了三个名词,这三个名词基本上贯穿整个设计模式:变化、耦合、依赖。从这三个词引伸出的理念就是:变化点在那里,我们就封装那里(或者说是变化点在那里,设计模式就用在那里);设计模式的出现其中一个重要的意图是为了实现松耦合的软件架构(其实我们的世界就是一个伟大的松耦合架构);要灵活混用设计模式,一定要清楚对象和模块之间的依赖关系并处理好这些依赖关系。也请大家记住:代码只是设计模式的一种表达方式,设计模式本身不是一种系统的架构,而更趁于是一种系统架构的设计思想。更需要记住的是:设计模式不要乱套,乱套设计模式就像是热天穿大毛衣一样,没需要用到设计模式千万不要用。两个情况用不到设计模式的:整个系统没变化;整个系统都不断地在变化。一句学设计模式的人都会听近的:要基于接口编程。

我看的是Gof的设计模式,Gof面向对象设计模式总共有23种,其中包括创建型、结构型和行为型这三大块,我先看的是创建型模式。
创建型模式是针对new这个关键字,创建型模式总共包括5个:Singleton 单件、Abstarct Factory 抽象工厂、Builder 生成器、Factory Method 工厂方法、Prototype 原型

Singleton 单件:这个是最简单的,也是最常用的。说白了就是某个对象在系统中只是唯一的,他在系统编译或者第一次访问时被加载到一个内存空间里,然后任何使用者都只是使用这个内存空间里的这个对象。在代码上面表达也非常简单,只需要确保变量或者对象由系统开始运行到结束只被创建一个就行,例如一些string变量,通常我会在前面加上static和readonly这两个修饰符(readonly是可选的,为了避免对象引用被重新指到另一个内存空间上而写的)。就算没有学过设计模式的程序员也应该经常会写到这个。用到的地方很多,例如你要将SQL写在代码里,还有一些存储系统信息的对象。

Abstarct Factory 抽象工厂、Factory Method 工厂方法、Prototype 原型:为什么将这三个模式放在一起说?是因为这三个模式其实差不多。相同点是他们要解决的东西和方向是相同的,都是为了解决多系列之间的变化。不同点只是实现方法不相同。这三个模式基本可以互换使用,而Factory Method基本会和Abstarct Factory用在一起。相信很多人都知道,微软最新的PetShop系统的主要结构就是依照Factory模式写的,没看过的人可以去看一下,Petshop里面将Factory表达的很形象,但不要为这个架构而着魔...就像当年的我,看了这个架构之后什么东西都用工厂模式去写,像个SB一样。这三个模式的变化点都在多系列的变化上面,例如一个汽车引擎他分了很多个系列,V6、V7的,我们只需要做好这个引擎的接口,然后通过Factory去选择具体是用那一个继承于这个接口的引擎就行了。而外部的汽车零件只需要知道这个引擎的接口和参数就行了,至于具体用那个引擎,就由搞引擎的Factory去做吧。至于Prototype在这个例子里的表现就是,一个仿真度能达到100%的翻版厂商,他拿到一个继承于这个引擎的接口的类之后,只需要不断的从这个原型中COPY出来就行。至于怎样做到对象之间的深拷贝,问MSDN吧。

Builder 生成器:这个模式其实和上面三个模式是差不多的。共同点也是解决多系列之间的变化,但不同点在于这些多系列的对象之间有着复杂的关系。或者我们可以从“生成器”这个词中去理解吧,举个例子,有一个网站是多样式的,有现代型啊,古典型等等,而这些系列都是由很多个不一样的CSS组成,例如定义背景颜色的CSS,每一个样式都由一个不同的CSS定义,而这时候我们做一个生成器,用来组合这些不同的CSS使他们能变成各种类型的样式。现代型有现代型的生成器,古典型有古典型的生成器,有多少个样式就有多少个生成器。然后再做一个生成器的接口,应用程序就是通过调用这个生成器的接口从而实现这个多样式的效果。那当然了,要有管理调用那一个生成器的类。

总结下来,其实创建型模式主要是用在多系列的变化上(Singleton忽略),在我们实际的应用开发中,片面看上去好像很少这样的应用,好像只是在多数据库的开发上面能用到。但其实如果你对模式理解得透切,你就会发现片地都需要用到...例如计算员工工资的,有多种级别的员工,每种级别的计算方式都不一样。这就是多系列,不同的工资计算方式就是就是变化点,我们就要在变化点上面用到设计模式,使得客户程序或者应用层程序跟这个计算工资的模块是松耦合的关系,而应用层程序只依赖于这个计算工资程序的接口。

PS:一定要看这本书哦:《设计模式-可复用面向对象软件的基础》,英文水平好的最好就看英文版。我这种E文菜鸟为了学E文,是E文和中文一起看的。

希望我这篇总结性的文章能帮到刚看设计模式的人,达人如果发现我有说错的地方请马上告之,感谢万分。
有什么问题可以发邮件到这个邮箱:ou.jasmine@gmail.com  我会尽量做到有问必复的
posted on 2007-10-31 17:11  jasmineou  阅读(2791)  评论(11编辑  收藏  举报