[转自]http://alaric.iteye.com/blog/1909867
建造模式(Builder)是对象的创建模式,建造模式可以将一个产品的内部表象与产品的生产过程分割开来,从而可以是建造过程生成具有不同内部表象的产品对象。一个产品常有不同的组成成分作为产品的零件,这些零件有可能是对象,也有可能不是对象,通常我们称作内部表象,不同的产品可以有不同的内部表象,也就是不同的零件。使用建造模式可以使客户端不需要知道所生成的产品有那些零件,每个产品对应的零件彼此有何不同,是怎么建造出来的,以及怎样组成产品的。建造模式的简略图如下图所示: 建造模式的角色:
抽象建造者(Builder)角色:给出一个抽象接口,用来规范产品对象各个组成成分的建造,跟商业逻辑无关,但是一般而言,有多少方法产品就有几部分组成。
具体建造者(Concrete Builder)角色:担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序调用下创建产品的实例包括创建产品各个零件和产品本身。
导演者(Director)角色:担任这个角色的类调用具体建造者角色创建产品对象。导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识是具体建造者。
产品(Product)角色:产品便是建造中的复杂对象,一般来说产品对象有多个部分组成,在一个体统中会有多余一个的产品类。
实例: 我们还举车的例子,现在要生产一辆客车,客车包括各个部分,如轮胎,底盘,发动机,座椅,外壳。建立以下模型: 上面的模型代码表示如下: 1、导演着: packagecom.pattern.builder;/** * *【描述】:导演者 *【作者】:alaric *【时间】:Jul 14, 2012 *【文件】:com.pattern.builder.Director.java * */publicclass Director {private Builder builder;public TrafficMachine construct(){ builder =new CoachBuilder(); builder.buildTire();//创建轮胎 builder.buildChassis();//创建底盘 builder.buildEngine();//创建发动机 builder.buildSeat();//创建座椅 builder.buildShell();//创建外壳return builder.retrieveResult();}} 2、抽象建造者 packagecom.pattern.builder;/** * *【描述】:抽象建造者 *【作者】:alaric *【时间】:Jul 14, 2012 *【文件】:com.pattern.builder.Builder.java * */publicinterface Builder {/** * *【描述】:建造轮胎 *【作者】:alaric *【时间】:Jul 14, 2012 * */publicvoid buildTire();/** * *【描述】:建造底盘 *【作者】:alaric *【时间】:Jul 14, 2012 * */publicvoid buildChassis();/** * *【描述】:建造引擎 *【作者】:alaric *【时间】:Jul 14, 2012 * */publicvoid buildEngine();/** * *【描述】:建造座椅 *【作者】:alaric *【时间】:Jul 14, 2012 * */publicvoid buildSeat();/** * *【描述】:建造外壳 *【作者】:alaric *【时间】:Jul 14, 2012 * */publicvoid buildShell();/** * *【描述】:返回产品 *【作者】:alaric *【时间】:Jul 14, 2012 * */public TrafficMachine retrieveResult();} 3、实现建造者 packagecom.pattern.builder;/** * *【描述】:客车建造者 *【作者】:alaric *【时间】:Jul 14, 2012 *【文件】:com.pattern.builder.CoachBuilder.java * */publicclass CoachBuilder implements Builder{private Coach coach =new Coach(); @Overridepublicvoid buildTire(){// 此处根据实际业务写相关逻辑 coach.setTire(new Tire());} @Overridepublicvoid buildChassis(){// 此处根据实际业务写相关逻辑 coach.setChassis(new Chassis());} @Overridepublicvoid buildEngine(){// 此处根据实际业务写相关逻辑 coach.setEngine(new Engine());} @Overridepublicvoid buildSeat(){// 此处根据实际业务写相关逻辑 coach.setSeat(new Seat());} @Overridepublicvoid buildShell(){// 此处根据实际业务写相关逻辑 coach.setShell(new Shell());}public TrafficMachine retrieveResult(){// 此处根据实际业务写相关逻辑return coach;}} 4、产品接口(可以没有) packagecom.pattern.builder;/** * *【描述】:抽象的车 *【作者】:alaric *【时间】:Jul 14, 2012 *【文件】:com.pattern.builder.TrafficMachine.java * */publicinterface TrafficMachine {} 5、客车类—实现产品类 packagecom.pattern.builder;/** * *【描述】:客车 *【作者】:alaric *【时间】:Jul 14, 2012 *【文件】:com.pattern.builder.Coach.java * */publicclass Coach implements TrafficMachine {private Chassis chassis;private Tire tire;private Engine engine;private Seat seat;private Shell shell;public Chassis getChassis(){return chassis;}publicvoid setChassis(Chassis chassis){this.chassis= chassis;}public Tire getTire(){return tire;}publicvoid setTire(Tire tire){this.tire= tire;}public Engine getEngine(){return engine;}publicvoid setEngine(Engine engine){this.engine= engine;}public Seat getSeat(){return seat;}publicvoid setSeat(Seat seat){this.seat= seat;}public Shell getShell(){return shell;}publicvoid setShell(Shell shell){this.shell= shell;}} 6、部件类 packagecom.pattern.builder;/** * *【描述】:轮胎 ---不错具体的实现 *【作者】:alaric *【时间】:Jul 14, 2012 *【文件】:com.pattern.builder.Tire.java * */publicclass Tire {}packagecom.pattern.builder;/** * *【描述】:底盘 *【作者】:alaric *【时间】:Jul 14, 2012 *【文件】:com.pattern.builder.Chassis.java * */publicclass Chassis {}packagecom.pattern.builder;/** * *【描述】:发动机 *【作者】:alaric *【时间】:Jul 14, 2012 *【文件】:com.pattern.builder.Engine.java * */publicclass Engine {}packagecom.pattern.builder;/** * *【描述】:座椅 *【作者】:alaric *【时间】:Jul 14, 2012 *【文件】:com.pattern.builder.Seat.java * */publicclass Seat {}packagecom.pattern.builder;/** * *【描述】:外壳 *【作者】:alaric *【时间】:Jul 14, 2012 *【文件】:com.pattern.builder.Shell.java * */publicclass Shell {}通过上面例子我们可以更明确创建模式的各个角色职能和作用,在现实开发中可能会省略一些,要根据实际业务来决定,以上是一个产品的例子,事实上多个产品的更为常见。我们将上面的模型扩展,加入多产品,模型如下:
多产品的实现和单一产品的实现基本一样,这里就不赘述了。当产品为多产品的时候整体结构有点像抽象工厂模式,但是我们只要把握重点,抽象工厂是在客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象;而建造模式重点在于影藏和封装复杂产品的内部建造过程和结构,侧重点和用意完全不同,这点要掌握了区分就很简单了。
|