建造者模式参考程杰《大话设计模式》
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
比如构造一个小人,需要头,胳膊,腿,身体,但是不同的人,比如海绵宝宝和小黄人,虽然都由这4部分构成,但是每一部分却都不相同,此时应使用建造者模式。
解析Builder:为创建一个Product对象的各个部件指定的抽象接口。需要定义抽象接口返回Product。
ConcreteBuilder:具体建造者,实现Builder接口,构造和装配各个部件。实现返回Product接口。
Product:具体的产品,最终建造出来的对象。
Director:指挥者,是构建一个使用Builder接口的对象,即指挥者的构建接口的参数是Builder。
建造者隐藏了产品是如何组装的,如果需要修改一个产品的组装,只需要再定义一个具体的建造者(ConcreteBuilder)就行了。
实例Builder
public abstract class Builder {
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
public abstract Product getResult();
}
ConcreteBuilder
public class ConcreteBuilder1 extends Builder{
private Product product = new Product();
@Override
public void buildPartA() {
product.addParts("小黄人PartA");
}
@Override
public void buildPartB() {
product.addParts("小黄人PartB");
}
@Override
public void buildPartC() {
product.addParts("小黄人PartC");
}
@Override
public Product getResult(){
return product;
}
}
public class ConcreteBuilder2 extends Builder{
private Product product = new Product();
@Override
public void buildPartA() {
product.addParts("海绵宝宝PartA");
}
@Override
public void buildPartB() {
product.addParts("海绵宝宝PartB");
}
@Override
public void buildPartC() {
product.addParts("海绵宝宝PartC");
}
@Override
public Product getResult(){
return product;
}
}
Product
public class Product {
private List listParts = new ArrayList<>();
public void addParts(String part){
listParts.add(part);
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder("Product is build by ");
for (String part:listParts
) {
builder.append(part + " ");
}
return builder.toString();
}
}
Director
public class Director {
public void constructProduct(Builder builder){
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
}
}
使用,分别创建一个小黄人和一个海绵宝宝
public class Demo1Application {
public static void main(String[] args) throws Exception {
Builder builder1 = (Builder) new ConcreteBuilder1();
Builder builder2 = (Builder) new ConcreteBuilder2();
Director director = new Director();
director.constructProduct(builder1);
Product result1 = builder1.getResult();
System.out.println(result1);
director.constructProduct(builder2);
Product result2 = builder2.getResult();
System.out.println(result2);
}
}
输出内容如下:



