建造者模式,又称生成器模式:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
三个角色:建造者、具体的建造者、监工、使用者(严格来说不算)
建造者角色:定义生成实例所需要的所有方法;
具体的建造者角色:实现生成实例所需要的所有方法,并且定义获取最终生成实例的方法;
监工角色:定义使用建造者角色中的方法来生成实例的方法;
使用者:使用建造者模式。
注意:定义中“将一个复杂的构建过程与其表示相分离”,表示并不是由建造者负责一切,而是由监工负责控制(定义)一个复杂的构建过程,由各个不同的建造者分别负责实现构建过程中所用到的所有构建步骤。不然,就无法做到“使得同样的构建过程可以创建不同的表示”这一目标。
1.建造者
//建造者角色 一个抽象类
public abstract class Builder {
//建造第一部分
public abstract void builderPart1();
//建造第二部分
public abstract void builderPart2();
//建造第三部分
public abstract void builderPart3();
}
2.监工
//监工 将一个复杂的构建过程与其表示想分离
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void setBuilder(Builder builder) {
this.builder = builder;
}
//定义(控制)一个复杂的构建过程
public void construct() {
builder.builderPart1();
for (int i = 0; i < 5; i++) {
builder.builderPart2();
}
builder.builderPart3();
}
}
3.具体的建造者角色
public class ConcreteBuilder1 extends Builder{
//假设sb.toString()为最终生成的产品
private StringBuffer sb=new StringBuffer();
@Override
public void builderPart1() {
sb.append("头");
}
@Override
public void builderPart2() {
sb.append(",身子");
}
@Override
public void builderPart3() {
sb.append(",尾巴");
}
public String getResult() {
return sb.toString();
}
}
4.客户端创建
public class Test {
public static void main(String[] args) {
ConcreteBuilder1 b1=new ConcreteBuilder1();
Director director=new Director(b1);
director.construct();
String result=b1.getResult();
System.out.println(result);
}
}
5.测试结果
头,身子,身子,身子,身子,身子,尾巴
6.结论
一个复杂的创建过程通过建造者模式进行了简化。
转载于
http://www.runoob.com/design-pattern/builder-pattern.html