将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,隐藏具体构建过程.
Builder.java
package com.gary.designpattern.builder;
/**
* 抽出整个build过程
* @author gary
*
*/
public interface Builder {
public void buildPartA();
public void buildPartB();
public void buildPartC();
public Product getProduct();
}
BuilderImplA.java
package com.gary.designpattern.builder;
/**
* 不同的Build具体实现
* @author gary
*
*/
public class BuilderImplA implements Builder {
private Product productA = new Product();
@Override
public void buildPartA() {
System.out.println("building A in BuilderImplA");
productA.addPart("A");
};
@Override
public void buildPartB() {
System.out.println("building B in BuilderImplA");
productA.addPart("B");
};
@Override
public void buildPartC() {
System.out.println("building C in BuilderImplA");
productA.addPart("C");
}
@Override
public Product getProduct() {
return productA;
};
}
BuilderImplB.java
package com.gary.designpattern.builder;
/**
* 不同的Build具体实现
* @author gary
*
*/
public class BuilderImplB implements Builder {
private Product productB = new Product();
@Override
public void buildPartA() {
System.out.println("building A in BuilderImplB");
productB.addPart("a");
};
@Override
public void buildPartB() {
System.out.println("building B in BuilderImplB");
productB.addPart("b");
};
@Override
public void buildPartC() {
System.out.println("building C in BuilderImplB");
productB.addPart("c");
}
@Override
public Product getProduct() {
return productB;
};
}
Director.java
package com.gary.designpattern.builder;
/**
* 控制整体建造过程,隐藏建造过程中每一步的具体实现
* @author gary
*
*/
public class Director {
private Builder builder;
/**
* 需要建造什么样的对象
* @param builder
*/
public Director(Builder builder) {
this.builder = builder;
}
public void build() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
}
public Product getProduct(){
return builder.getProduct();
}
}
Product.java
package com.gary.designpattern.builder;
public class Product{
private String data = "";
public void addPart(String part) {
data += part;
}
public void printProduct() {
System.out.println(data);
}
}
Test.java
package com.gary.designpattern.builder;
/**
* 测试
* @author gary
*
*/
public class Test {
public static void main(String[] args) {
BuilderImplA builderA = new BuilderImplA();
Director directorA = new Director(builderA);
directorA.build();
Product productA = directorA.getProduct();
productA.printProduct();
System.out.println("========split=======");
BuilderImplB builderB = new BuilderImplB();
Director directorB = new Director(builderB);
directorB.build();
Product productB = directorB.getProduct();
productB.printProduct();
}
}