Loading... # 设计模式(十)——建造者模式 ## 参考 > 大话设计模式  ——  程杰 著 ## 目录 [设计模式(一)——简单工厂模式](https://www.princelei.club/archives/67.html) [设计模式(二)——策略模式](https://www.princelei.club/archives/68.html) [设计模式(三)——设计原则](https://www.princelei.club/archives/116.html) [设计模式(四)——装饰模式](https://www.princelei.club/archives/117.html) [设计模式(五)——代理模式](https://www.princelei.club/archives/119.html) [设计模式(六)——工厂方法模式](https://www.princelei.club/archives/132.html) [设计模式(七)——原型模式](https://www.princelei.club/archives/133.html) [设计模式(八)——模板方法模式](https://www.princelei.club/archives/134.html) [设计模式(九)——外观模式](https://www.princelei.club/archives/135.html) [设计模式(十)——建造者模式](https://www.princelei.club/archives/136.html) [设计模式(十一)——观察者模式](https://www.princelei.club/archives/137.html) [设计模式(十二)——抽象工厂模式](https://www.princelei.club/archives/138.html) [设计模式(十三)——状态模式](https://www.princelei.club/archives/139.html) [设计模式(十四)——适配器模式](https://www.princelei.club/archives/140.html) [设计模式(十五)——备忘录模式](https://www.princelei.club/archives/141.html) [设计模式(十六)——组合模式](https://www.princelei.club/archives/147.html) [设计模式(十七)——迭代器模式](https://www.princelei.club/archives/148.html) [设计模式(十八)——单例模式](https://www.princelei.club/archives/157.html) [设计模式(十九)——桥接模式](https://www.princelei.club/archives/159.html) [设计模式(二十)——命令模式](https://www.princelei.club/archives/160.html) [设计模式(二十一)——职责链模式](https://www.princelei.club/archives/161.html) [设计模式(二十二)——中介者模式](https://www.princelei.club/archives/162.html) [设计模式(二十三)——享元模式](https://www.princelei.club/archives/163.html) [设计模式(二十四)——解释器模式](https://www.princelei.club/archives/173.html) [设计模式(二十五)——访问者模式](https://www.princelei.club/archives/174.html) ## 何为建造者模式 - 建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 如果我们用了建造者模式,那么用户就只需指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需知道了。 ## 示例 ``` /** * 产品类 */ public class Product { List<String> parts = new ArrayList<>(); public void add(String part){ parts.add(part); } public void show(){ System.out.println("产品 创建"); parts.forEach(System.out::println); } } ``` ``` /** * 抽象建造者类 */ public interface Builder { void buildPartA(); void buildPartB(); Product getResult(); } ``` ``` /** * 具体建造者类 */ public class ConcreteBuilder1 implements Builder { private Product product; public ConcreteBuilder1() { product = new Product(); } @Override public void buildPartA() { product.add("部件A"); } @Override public void buildPartB() { product.add("部件B"); } @Override public Product getResult() { return product; } } ``` ``` /** * 具体建造者类 */ public class ConcreteBuilder2 implements Builder { private Product product; public ConcreteBuilder2() { product = new Product(); } @Override public void buildPartA() { product.add("部件X"); } @Override public void buildPartB() { product.add("部件Y"); } @Override public Product getResult() { return product; } } ``` ``` /** * 指挥者类 */ public class Director { public Builder construct(Builder builder) { builder.buildPartA(); builder.buildPartB(); return builder; } } ``` ``` /** * 客户端 */ public class BuilderMainClass { public static void main(String[] args) { Director director = new Director(); Product p1 = director.construct(new ConcreteBuilder1()).getResult(); p1.show(); Product p2 = director.construct(new ConcreteBuilder2()).getResult(); p2.show(); } } ``` 输出: ``` 产品 创建 部件A 部件B 产品 创建 部件X 部件Y ``` 我们不用为每一个产品设置不同的属性,我们封装好产品A和产品B,客户端只需要告诉指挥者,我需要哪一个产品就好了。 建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需再定义一个具体的建造者就可以了。 建造者模式实在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。 Last modification:June 11th, 2020 at 06:25 pm © 允许规范转载