设计模式-builder(构造器模式)
Bilder模式定义:
将一个复杂对象的构建和表示分离,是同样的创建构建过程可以创造不同的表示。
Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们。用用不知道内部的具体构建细节。Builder模式是非常类似抽象工厂模式,细微的区别大概只是在反复使用中才能体会到。
为何使用建造者模式
是为了将复杂对象的构建过程与它的部件分离。注意: 是解耦过程和部件。
因为一个复杂的对象,不但有很多大量组成部分。例如汽车,有很多部件:车轮、方向盘、发动机,还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一辆汽车,这个装配过程也很复杂(需要很好的组装技术),Builder模式就是为了将部件和组装过程分开。
建造者模式典型结构图

如何使用建造者模式
首先假设一个复杂对象是由多个部件组成的,Builder模式是吧复杂对象的创建和部件的创建分开来,分别用Director和Builder类来表示。
如果需要一个接口来创建部件:
package com.designpatten.builder; public interface Builder { void buildCarWheel() ; void buildSteeringWheel() ; void buildEngine() ; void buildCarFrame() ; Car getCar() ; }
在Director中构建复杂对象,将Builder中定义的一个一个部件组装起来。
package com.designpatten.builder; public class Director { private Builder builder ; public Director(Builder builder){ this.builder = builder ; } public void getCarTogether(){ builder.buildCarFrame() ; builder.buildEngine(); builder.buildCarWheel() ; builder.buildSteeringWheel() ; } }实现具体的Builder:
- 通过实现接口,来完成部件的构建过程
- 重新获得目标对象接口
package com.designpatten.builder; public class BenzBuilder implements Builder { private Benz benz ; public BenzBuilder(){ benz = new Benz() ; } @Override public void buildCarWheel() { System.out.println("Benz add Wheel"); } @Override public void buildSteeringWheel() { System.out.println("Benz add SteeringWheel"); } @Override public void buildEngine() { System.out.println("Benz add engine"); } @Override public void buildCarFrame() { System.out.println("Benz add frame"); } @Override public Car getCar() { return benz; } }
package com.designpatten.builder; public class BMWBuilder implements Builder { private BMW bmw ; public BMWBuilder(){ bmw = new BMW() ; } @Override public void buildCarWheel() { System.out.println("BMW add CarWheel"); } @Override public void buildSteeringWheel() { System.out.println("BMW add SteeringWheel"); } @Override public void buildEngine() { System.out.println("BMW add Engine"); } @Override public void buildCarFrame() { System.out.println("BMW add Frame"); } @Override public Car getCar() { return bmw; } }具体的产品信息
package com.designpatten.builder; public interface Car { void run() ; }
package com.designpatten.builder; public class BMW implements Car { @Override public void run() { System.out.println("BMW ---> run()"); } }
package com.designpatten.builder; public class Benz implements Car { @Override public void run() { System.out.println("Benz -------> run()"); } }生产Car
package com.designpatten.builder; public class Client { public static void main(String[] args) { BenzBuilder benzBuilder = new BenzBuilder() ; BMWBuilder bmwBuilder = new BMWBuilder() ; Director benzDirector = new Director(benzBuilder) ; benzDirector.getCarTogether() ; Car benz = benzBuilder.getCar() ; benz.run() ; System.out.println("----------------------------"); Director bmwDirector = new Director(bmwBuilder) ; bmwDirector.getCarTogether() ; Car bmw = bmwBuilder.getCar() ; bmw.run() ; } }
输出结构
Benz add frame Benz add engine Benz add Wheel Benz add SteeringWheel Benz -------> run() ---------------------------- BMW add Frame BMW add Engine BMW add CarWheel BMW add SteeringWheel BMW ---> run()
参考:http://www.weixueyuan.net/view/6110.html
C++设计模式
http://www.iteye.com/topic/71175
http://www.cnblogs.com/moonz-wu/archive/2011/01/11/1932473.html