建造者模式(Builder pattern)是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
简单的说,新建一个由多个部分组成的对象,多个部分交给Builder(建造者)完成。如果对建造的顺序有要求,由一个指挥者决定每个部分的建造顺序。
1,定义一个产品:
public class Product { List<String> parts = new ArrayList<String>(); public void add(String part){ parts.add(part); } public void show(){ System.out.println("对象内部样子:"); for (String str : parts) { System.out.println(str); } } }
2,所有的建造者需要继承此抽象类
public abstract class Builder { public abstract void builderPart1(); public abstract void builderPart2(); public abstract Product getResult(); }
3,定义两个建造者(具体工作实现,两个是为了更好的理解)
public class ConcreteBuilder1 extends Builder { private Product product = new Product(); @Override public void builderPart1() { product.add("partA"); } @Override public void builderPart2() { product.add("partB"); } @Override public Product getResult() { return product; } } public class ConcreteBuilder2 extends Builder{ private Product product = new Product(); @Override public void builderPart1() { product.add("part X"); } @Override public void builderPart2() { product.add("part Y"); } @Override public Product getResult() { return product; } }
4,定义一个指挥者(决定建造内部的顺序)
public class Director { public void Construct(Builder builder){ builder.builderPart1(); builder.builderPart2(); } }
5,得到产品
public class BuilderPattern { public static void main(String[] args) { Director director = new Director(); Builder builder1 = new ConcreteBuilder1(); Builder builder2 = new ConcreteBuilder2(); director.Construct(builder1); //director.Construct(builder2); Product result = builder1.getResult(); result.show(); } }
6,执行结果
产品内部样子:
partA
partB
Process finished with exit code 0
如果将
director.Construct(builder1);
这句代码也注释掉,无论打不打开
director.Construct(builder2);
运行代码,产品内部什么都没有
产品内部样子:
Process finished with exit code 0
使用建造者模式,可以让对象的组成部分(建造方式实现)和算法(如:建造顺序)相独立。
附:有印象在什么地方使用过建造者模式,一时想不起来,想到了会补充。