前言
建造者模式也称生成器模式,核心思想是将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。
建造者模式一般认为有四个角色:
产品角色,产品角色定义自身的组成属性
抽象建造者,抽象建造者定义了产品的创建过程以及如何返回一个产品
具体建造者,具体建造者实现了抽象建造者创建产品过程的方法,给产品的具体属性进行赋值定义
指挥者,指挥者负责与调用客户端交互,决定创建什么样的产品
为什么使用:
- 对象的生产需要复杂的初始化,比如给一大堆类成员属性赋初值,设置一下其他的系统环境变量。使用建造者模式可以将这些初始化工作封装起来。
- 对象的生成时可根据初始化的顺序或数据不同,而生成不同角色。
- 例如:汽车,他的发动机引擎有好多品牌,轮胎也有各种材质,内饰更是千奇百怪;鸟,他的头、翅膀以及脚有各种颜色和形状,在创建这种复杂对象的时候,我们建议使用建造者模式。
应用
在很多游戏软件中,地图包括天空、地面、背景等组成部分,人物角色包括人体、服装、装备等组成部分,可以使用建造者模式对其进行设计,通过不同的具体建造者创建不同类型的地图或人物
实例
以下将用一个大家比较熟悉的游戏《英雄联盟》 作为一个简单的例子,现在我们想创建一个角色,我们通过使用建造者模式去设计如果创建不同的属性的角色
1 | /** |
总结
使用建造者模式时,我们把创建一个role实例的过程分为了两步.
一步是先交给对应角色的建造者,如Ez建造者。这样的好处就把角色的属性设置封装了起来,我们不用在new一个Role时,因为要得到一个Ez角色的实例,而在外面写了一堆$ez->power=70。
另一步是交给了一个建造指挥者,调了一个built方法,通过先设置power,再设置Crit的顺序,初始化这个角色。当然在这个例子中,初始化的顺序,是无所谓的。但是如果对于一个建造汉堡,或是地图,初始化的顺序不同,可能就会得到不同的结果。
也许,你会说,我直接设置也很方便呀。是的,对于某些情况是这样的。但是如果你考虑,我现在想增加一个寒冰角色呢?如果我现在想让建造有初始化有三种不同的顺序呢?
如果你使用了建造者模式,这两个问题就简单了,增加一个寒冰角色,那就增加一个寒冰建造者类。初始化三种不同的顺序,那么就在指挥建造者中增加两种建造方法。