设计模式-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