Builder模式是什么?
将一个复杂对象的构建过程与它每一过程中的实现细节分离,使得用同样的构建过程可以创建不同的产品对象。
Builder模式的结构
建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。
具体建造者(ConcreteBuilder)角色:担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:
•实现Builder角色提供的接口,一步一步完成创建产品实例的过程。
•在建造过程完成后,提供产品的实例。
指导者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。
产品(Product)角色:产品便是建造中的复杂对象。
指导者角色是于客户端打交道的角色。导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为客户端所知。
Builder模式的变体
将ConcreteBuilder放在Product的内部,将Product的Constructor设为private,这样创建Product方法时就只能通过Builder来创建,而不能直接调用new Product()。
public class Product {
private ArrayList<String> parts = new ArrayList<String>();
private Product(ConcreteBuilder builder){
//some initialization
}
public void add(String part) {
parts.add(part);
}
public void show() {
System.out.println("Product parts: ");
for (String part : parts) {
System.out.println(part);
}
}
public static class ConcreteBuilder{
private Product product;
public Product build(){
product = new Product(this);
buildPartA();
buildPartB();
return product;
}
public void buildPartA() {
product.add("ConcreteBuilder1-->partA");
}
public void buildPartB() {
product.add("ConcreteBuilder1-->partB");
}
public Product getResult(){
return product;
}
}
}
public class Client {
public static void main(String[] args){
ConcreteBuilder builder = new ConcreteBuilder();
builder.build();
Product product = builder.getResult();
product.show();
}
}