当前位置:文档之家› 浅谈建造者模式

浅谈建造者模式

浅谈建造者模式
“设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。

使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。

毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。

项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。

”在设计模式这门课程的学习中,我们了解到了有23种设计模式,每种模式都有他们的特色,而在学习设计模式的过程中,最令我印象深刻的就是建造者模式。

建造者模式是一种较为复杂的创建型模式,他将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端无需知道复杂对象的内部组成部分与装配方式,只需知道所需的建造者类型即可。

建造者模式关注一步一步地创建一个复杂对象,不同的具体建造者定义了不同的创建过程,且具体建造者相互独立,增加新的建造着非常方便,无需修改已有代码,系统具有较好的扩展性。

这让我联想到了游戏里面的角色设计,如果每个新角色的设计都要重新编写代码的话就会耗费相当大的功夫,但是如果用建造者模式的思想来设计的话就会轻松很多,增加新的建造者非常方便,无需修改已有代码,可以提高代码的复用率,减少重复“造轮子”的时间。

结合本学期所学到的设计模式知识以及以前学的专业知识,我做了一个LOL(英雄联盟)角色设计的小项目。

在这个项目中,我使用了五个类来进行编写(代码详情见src文件夹)。

图1 LOL角色设计结构图
(1)Builder(抽象建造者):构建者接口,定义构建各部件的方法。

(2)RoleBuilder (具体建造者):实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。

(3)Role(产品角色):表示被构造的角色。

RoleBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

(4)Director(指挥者):构造一个使用Builder接口的对象。

(5)Client(成品类):将所设计的角色在控制台进行输出。

在编写的过程中,我发现建造者模式与抽象工厂模式有点相似,但是建造者模式返回的是一个完整的复杂产品,而抽象工厂模式则是返回一系列相关的产品。

在抽象工厂模式中,客户端通过选择具体工厂来生成所需对象,而在建造者模式中,客户端通过指定具体建造者类型并指导Director类如何去生成对象,然后将结果返回。

我觉得,在建造者模式中,最重要的一点就是它引进了Director()类,它一方面隔离了客户与创建过程,另一方面也控制了产品的创建过程,指挥者针对抽象建造者编程,客户端只需要知道具体建造者的类型,就可以通过指挥者类调用建造者的相关方法,这让我联想到了生活中的案例,例如客户想要自己组装一台电脑,销售人员只需要确定客户的需求,就可以以让组装人员为客户组装电脑,客户无
需了解装配的具体过程。

所以设计模式中的很多模式都是来源于生活,然后又作用于生活,不禁令我赞叹于前人的智慧。

这也让我有所启发,学习设计模式,不能只拘泥于形式,重要的是其中的思想,要在运用时能够信手拈来。

而要做到这点,就要求我们要学会观察生活,尤其是我们学习计算机的学生,更加要观察生活,因为我们编程就是为了让世界变得更美好,让人们生活得更加方便。

在此次的小项目中,我就联想到了游戏里面人物的设计,游戏需要更新,角色需要增加,但是不可能每增加一个角色就改所有的代码,所以我想到了使用建造者模式来解决这一问题。

在我的小项目里面,如果要修改角色信息,只需要更改RoleBuilder()类即可,如果想要增加新角色,可以增加一个新的具体角色建造类,原有代码无需修改,这完全符合设计模式的开闭原则。

凡事有利也有弊,建造者模式也一样,通过这次的项目开发,我了解到建造者模式的优点:(1)在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建进行解耦,使得相同的创建过程可以创建不同的产品对象。

在我编写的LOL角色创建项目里,我就利用了这一点来进行角色的创建,只需要修改或者增加少量的代码,就可以达到目的。

(2)每一个具体建造者都是独立的,与其他的具体建造者无关,因此可以很方便的替换具体建造者或增加具体建造者用户使用不同的具体建造者即可得到不同的产品对象,由于指挥者类针对抽象建造者编程,增加新的具体建造者无需修改原有类库的代码,系统扩展方便,符合开闭原则。

在代码编写中,代码复用率是尤为重要的,我此次的项目也极力地做到大多数代码能够重复使用。

(3)用户可以更加精细的控制产品的创建过程,将复杂的产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。

我此次的项目分为5个类,实现了LOL角色设计的分解,也使得代码条理清晰,创建也更加方便。

但是建造者模式也有缺点,建造者模式的缺点:
(1)建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性较大,例如很多组成部分不相同,则不适合使用建造者模式,因此使用范围收到一定的限制。

在此次LOL 角色设计的项目中,我就体会到了这一点,我所设计的角色,都是大同小异,不能够有特殊的东西,不然就无法实现,这也是建造者模式的一个局限性之所在。

(2)如果产品的内部变化复杂,可能会需要定义很多具体建造者类来实现这种变化,导致系统变得和庞大,增加了系统的理解难度和运行成本。

在此次代码的编写中,为了实现不同的角色实例,必须要建不同的具体类,这样长此以往,有多少个角色就要增加多少个类,这会大大增加产品的内存占用率,这对于用户来说是不愿意看到的
经过这次LOL角色设计的小项目,我更加深刻地体会到了设计模式的重要性,它在我们的编程过程中,有着举足轻重的作用,尤其是对建造者模式有了更加深入的体会。

我意识到,建造者模式的核心在于如何一步一步地构建一个包含多个组成部件的完整对象,使用相同的构建过程构建不同的产品。

在编程中要多使用设计模式,使我们的代码具有更高的可读性和可复用性。

参考文献
[1] 刘伟,胡志刚,郭克华.设计模式.北京:清华大学出版社,2011
[2]刘继华.漫谈设计模式——从面向对象开始.北京:清华大学出版社,2012
[3]莫永腾.深入浅出设计模式(C#/Java).北京:清华大学出版社,2006
[4]陈臣,王斌.研磨设计模式.北京:清华大学出版社,2010
[5]秦小波.设计模式之禅.北京:机械工业出版社,2010。

相关主题