建造者模式用来将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
UML图:
我们希望获得拥有不同组件的Product,这时我们使用建造者模式,ConcreteBuilder1、2使用相同的接口,为Product加入不同组件。
Director类控制组装过程,最后返回Product实例。
代码:
Product类:
import java.util.ArrayList; import java.util.List; public class Product { private List<String> parts = new ArrayList<>(); public void add(String s) { parts.add(s); } public void show() { for (String s: parts){ System.out.println(s); } } }
Builder类及其子类:
public abstract class Builder { protected Product product = new Product(); public abstract void buildPartA(); public abstract void buildPartB(); public Product getResult() { return product; } } public class ConcreteBuilder1 extends Builder { @Override public void buildPartA() { product.add("part A"); } @Override public void buildPartB() { product.add("part B"); } } public class ConcreteBuilder2 extends Builder { @Override public void buildPartA() { product.add("part X"); } @Override public void buildPartB() { product.add("part Y"); } }
Director类:
public class Director { private Builder builder = null; public Director(Builder builder) { this.builder = builder; } public Product getProduct(){ builder.buildPartA(); builder.buildPartB(); return builder.getResult(); } }
Demo:
public class BuilderDemo { public static void main(String[] args) { Builder c1 = new ConcreteBuilder1(); Director d1 = new Director(c1); Product p1 = d1.getProduct(); p1.show(); Builder c2 = new ConcreteBuilder2(); Director d2 = new Director(c2); Product p2 = d2.getProduct(); p2.show(); } }