⑵当构造过程必须允许被构造的对象有不同的表示时
⑵ConcreteBuilder:Builder接口的实现类,用以构造和装配复杂对象的各个部件,并提供一个返回产品的接口方法
⑶Dirctor:导向器,用于构造一个使用Builder接口的对象
⑷Product:表示被构造的复杂对象
⑵通过Director对象的construct方法构建复杂对象(生成各个组件并进行组装)
⑶通过Builder对象获取构造完成的复杂对象
/** * @描述:生成器统一接口 * @创建时间:2015-9-28 上午9:55:15 */ public interface Builder { void buildPart1(); void buildPart2(); Product getResult(); }
public class ConcreteBuilder1 implements Builder { private Product product; // part1与part2分别属于复杂对象的一部分,有自己的装配逻辑 @Override public void buildPart1() { product = new Product(); product.add("PartA"); } @Override public void buildPart2() { product.add("PartB"); } @Override public Product getResult() { return product; } } public class ConcreteBuilder2 implements Builder { private Product product; @Override public void buildPart1() { product = new Product(); product.add("PartX"); } @Override public void buildPart2() { product.add("PartY"); } @Override public Product getResult() { return product; } }
/** * @描述:导向器,用于构造一个使用Builder接口实例的对象 * @创建时间:2015-9-28 上午10:02:34 */ public class Director { public void construct(Builder builder) { builder.buildPart1(); builder.buildPart2(); } }
/** * @描述:表示被构造的复杂对象 * @创建时间:2015-9-28 上午9:48:25 */ public class Product { List<String> parts = new ArrayList<>(); public void add(String part) { parts.add(part); } public void show() { System.out.println("-----------Product Parts-----------"); for (String part : parts) { System.out.println(part); } } }
/** * @描述:⑴ 客户创建Director对象,并用它所需要的Builder对象进行配置 * ⑵ 一旦产品部件被生成,导向器就会通知生成器 * ⑶ 生成器处理导向器的请求,并将部件添加到该产品中 * ⑷ 客户从生成器中检索产品 * @创建时间:2015-9-28 上午10:06:12 */ public class TestClient { public static void main(String[] args) { // 导向器可以被多个建造者共用 Director direc = new Director(); Builder builder1 = new ConcreteBuilder1(); Builder builder2 = new ConcreteBuilder2(); // 构造复杂对象(每个复杂对象的组件先后生成并组装,然后完成复杂对象的构造) direc.construct(builder1); // 通过生成器对象获取构造完成的复杂对象 Product p1 = builder1.getResult(); p1.show(); // 构造复杂对象(每个复杂对象的组件先后生成并组装,然后完成复杂对象的构造) direc.construct(builder2); // 通过生成器对象获取构造完成的复杂对象 Product p2 = builder2.getResult(); p2.show(); } }
例子来源: http://www.cnblogs.com/lds85930/articles/643143.html