经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式-建造者模式
来源:cnblogs  作者:fonxi  时间:2019/5/28 9:31:37  对本文有异议

建造者模式(创建型模式)

  • 定义

建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。[DP]

 

自己的理解:建造者模式是把复杂得对象的构建分离出来,然后调用者不用知道对象的构建细节,只需要指定类型,就可以得到构建好的对象,且对象完整。


 

  • 特点
  1. 具体产品构建出来的顺序不变
  2. 指挥者按顺序调用建造者的各个方法
  3. 产品的构建步骤被拆分成每一个方法

 

  • 结构

Builder:建造者父接口

ConcreteBuilder1:具体建造者

ConcreteBuilder2:具体建造者

Director:指挥者,构建一个产品时,调用建造者的各个方法

Product:具体产品

 


 

  • 代码

例子:一个完整的小人作为具体产品,完整的产品必须有头、身体、手、腿,构建两个不同的小人作为两个具体的建造者,创建小人的所有步骤由指挥者调用,客户端调用只需指定需要哪种小人,就可以得到完整的小人(不会缺手缺脚)。

       建造者父接口

  1. /**
  2. * @ Author :fonxi
  3. * @ Date :2019/5/24 15:59
  4. * @ Description:创建一个Product对象的各个不见置顶的抽象接口
  5. */
  6. public abstract class Builder {
  7. public abstract void buildHead();
  8. public abstract void buildBody();
  9. public abstract void buildHand();
  10. public abstract void buildFoot();
  11.  
  12. public abstract Product GetResult();
  13.  
  14. }

  具体建造者

  1. /**
  2. * @ Author :fonxi
  3. * @ Date :2019/5/24 15:59
  4. * @ Description:具体的建造者
  5. */
  6. public class ConcreteBuilder1 extends Builder{
  7. private Product product = new Product();
  8.  
  9. @Override
  10. public void buildHead() { product.add("大大的头"); }
  11.  
  12. @Override
  13. public void buildBody() { product.add("小小的身体"); }
  14.  
  15. @Override
  16. public void buildHand() { product.add("胖胖的手"); }
  17.  
  18. @Override
  19. public void buildFoot() { product.add("短短的腿"); }
  20.  
  21. public Product GetResult(){
  22. return product;
  23. }
  24. }

  

  1. /**
  2. * @ Author :fonxi
  3. * @ Date :2019/5/24 15:59
  4. * @ Description:具体建造者
  5. */
  6. public class ConcreteBuilder2 extends Builder{
  7. private Product product = new Product();
  8.  
  9. @Override
  10. public void buildHead() { product.add("圆圆的头"); }
  11.  
  12. @Override
  13. public void buildBody() { product.add("有点胖的身体"); }
  14.  
  15. @Override
  16. public void buildHand() { product.add("漂亮的手"); }
  17.  
  18. @Override
  19. public void buildFoot() { product.add("长长的腿"); }
  20.  
  21. @Override
  22. public Product GetResult() {
  23. return product;
  24. }
  25. }

  指挥者

  1. /**
  2. * @ Author :fonxi
  3. * @ Date :2019/5/24 16:00
  4. * @ Description:指挥者,构建一个使用Builder接口的对象
  5. */
  6. public class Director {
  7. public void cooking(Builder builder){
  8. builder.buildHead();
  9. builder.buildBody();
  10. builder.buildHand();
  11. builder.buildFoot();
  12. }
  13. }

  具体产品

  1. /**
  2. * @ Author :fonxi
  3. * @ Date :2019/5/24 16:00
  4. * @ Description 具体产品
  5. */
  6. public class Product {
  7. private List<String> list = new ArrayList<>();
  8.  
  9. //产品构建
  10. public void add(String str){
  11. list.add(str);
  12. }
  13.  
  14. //创建出一个构建好的 产品
  15. public void show(){
  16. list.forEach(System.out::println);
  17. }
  18. }

  客户端调用类

  1. /**
  2. * @ Author :fonxi
  3. * @ Date :2019/5/24 15:58
  4. * @ Description:客户端调用类
  5. */
  6. public class TestController {
  7. public void print(){
  8. Director director = new Director();
  9. Builder concreteBuilder1 = new ConcreteBuilder1();
  10. Builder concreteBuilder2 = new ConcreteBuilder2();
  11.  
  12. System.out.println("不漂亮的小人");
  13. director.cooking(concreteBuilder1);
  14. Product product = concreteBuilder1.GetResult();
  15. product.show();
  16.  
  17. System.out.println("漂亮的小人");
  18. director.cooking(concreteBuilder2);
  19. product = concreteBuilder2.GetResult();
  20. product.show();
  21. }
  22. }

  输出

  1. 不漂亮的小人
  2. 大大的头
  3. 小小的身体
  4. 胖胖的手
  5. 短短的腿
  6.  
  7. 漂亮的小人
  8. 圆圆的头
  9. 有点胖的身体
  10. 漂亮的手
  11. 长长的腿

  只需要指定需要哪种类型的对象,那这个对象就会完完整整的拿到,不用关系构建的细节,也不会出现对象不完整。


 

  • 使用场景
  1. 需要的创建的对象构建时非常复杂,且对象构建的过程是稳定的,但对象内部的构建通常面临着复杂的变化

 

 

  • 优缺点

优点:

  1. 每一个建造者都相对独立,不管是替换还是新增都很方便,可扩展性性高
  2. 对象构建步骤拆分,能够更细的控制对象的创建过程
  3. 客户端调用不需要知道对象的构建细节,也不用去进行复杂得构建,简便

缺点:

  1. 构建的产品必须相同的建构步骤
  2. 类增多,项目变得复杂、庞大

 

  • 总结

建造者模式和工厂类有点象,但更关注对象构建的顺序。建造者模式能解决产品建构时复杂,产品创建类型多变的情况,但是要求产品构建时稳定,所以有一定局限。

原文链接:http://www.cnblogs.com/fonxi/p/10934706.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号