经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
【建造者设计模式详解】Java/JS/Go/Python/TS不同语言实现
来源:cnblogs  作者:刀法如飞  时间:2023/3/14 8:47:27  对本文有异议

简介

建造者模式(Builder Pattern),也叫生成器模式,属于创建型模式。它使用多个简单的对象一步一步构建成一个复杂的对象。它允许你使用相同的创建代码生成不同类型和形式的对象。

当你希望使用代码创建不同形式的产品 (例如各种商品和订单) 时, 一些基本部件不会变,而其组合经常变化的时候,就可以考虑建造者模式。

 

作用

  1. 当需要创建复杂对象的时候,由各个部分的子对象来逐步构建,以适应复杂多变的情况。
  2. 具体的建造者类之间是相互独立的,这有利于系统的扩展。
  3. 将变与不变分离开。主管类隐藏了产品构造细节, 客户端只需要将一个生成器与主管类关联,就能从生成器处构造对象。

 

实现步骤

  1. 定义主管类,可以制造所有形式的产品。
  2. 在基本生成器接口中声明创建产品的步骤。
  3. 为每个形式的产品创建具体生成器类,并实现其构造步骤。
  4. 客户端同时创建生成器和主管类,所有产品都遵循相同的接口,构造结果通过主管类获取。

 

UML

 

 

代码

 

创建建造者接口

 

  1. // Builder.java 建造者接口,定义基本建造方法
  2. public interface Builder {
  3. public void reset();
  4. public void setName(String name);
  5. public void setScreen(Integer[] screen);
  6. public void setGPU(Integer no);
  7. }

 

具体建造者类,可以多个

  1. // ManualBuilder.java 使用手册建造者类也实现了建造者接口
  2. public class ManualBuilder implements Builder {
  3. private Manual manual;
  4. public void reset() {
  5. this.manual = new Manual();
  6. }
  7. public void setName(String name) {
  8. this.manual.setName(name);
  9. }
  10. public void setScreen(Integer[] screen) {
  11. this.manual.setScreen(screen);
  12. }
  13. public void setGPU(Integer no) {
  14. this.manual.setGpuType(no);
  15. }
  16. public Manual getProduct() {
  17. return this.manual;
  18. }
  19. }
  20. // PhoneBuilder.java 手机建造者实现了建造者接口
  21. public class PhoneBuilder implements Builder {
  22. private Phone phone;
  23. public void reset() {
  24. this.phone = new Phone();
  25. }
  26. public void setName(String name) {
  27. this.phone.setName(name);
  28. }
  29. public void setScreen(Integer[] screen) {
  30. this.phone.setScreen(screen);
  31. }
  32. public void setGPU(Integer no) {
  33. this.phone.setGpuType(no);
  34. }
  35. public Phone getProduct() {
  36. return this.phone;
  37. }
  38. }

 

 

定义具体产品类,不同建造者建造不同产品

 

  1. // Manual.java 手册产品类
  2. public class Manual {
  3. private String name = "PhoneManualName";
  4. private Integer[] screen = { 0, 0 };
  5. private Integer gpuType = 0;
  6. private Integer pages = 0;
  7. public void setName(String name) {
  8. this.name = name;
  9. }
  10. public String getName() {
  11. return this.name;
  12. }
  13. public void setScreen(Integer[] screen) {
  14. this.screen = screen;
  15. }
  16. public Integer[] getScreen() {
  17. return this.screen;
  18. }
  19. ......
  20. }
  21. // Phone.java 手机产品类
  22. public class Phone {
  23. private String name = "PhoneName";
  24. private Integer[] screen = { 0, 0 };
  25. private Integer gpuType = 0;
  26. public void setName(String name) {
  27. this.name = name;
  28. }
  29. public String getName() {
  30. return this.name;
  31. }
  32. public void setScreen(Integer[] screen) {
  33. this.screen = screen;
  34. }
  35. public Integer[] getScreen() {
  36. return this.screen;
  37. }
  38. ......
  39. }

 

 

指挥调度类

 

  1. // Director.java 指挥调度类,负责利用建造者建造产品,隔离需求与功能
  2. public class Director {
  3. // 建造phone1
  4. public void buildIPhone(Builder builder) {
  5. builder.reset();
  6. Integer[] screen = { 120, 500 };
  7. builder.setName("iPhone");
  8. builder.setScreen(screen);
  9. builder.setGPU(100);
  10. }
  11. // 建造phone2
  12. public void buildHuaweiPhone(Builder builder) {
  13. builder.reset();
  14. Integer[] screen = { 130, 600 };
  15. builder.setName("HuaweiPhone");
  16. builder.setScreen(screen);
  17. builder.setGPU(102);
  18. }
  19. // 建造phone3
  20. public void buildMiPhone(Builder builder) {
  21. builder.reset();
  22. Integer[] screen = { 120, 650 };
  23. builder.setName("MiPhone");
  24. builder.setScreen(screen);
  25. builder.setGPU(103);
  26. }
  27. }

 

 

测试调用

 

  1. /**
  2. * 建造者模式是使用多个简单的对象一步一步构建出一个复杂的对象来。
  3. * 分为主管类和建造这类,主管类负责具体指挥调度,建造负责具体实施。
  4. * 主管类通过一步一步调用各种建造者实现复杂对象。
  5. */
  6.  
  7. // 声明指挥者
  8. Director director = new Director();
  9. // 创建手机
  10. PhoneBuilder phoneBuilder = new PhoneBuilder();
  11. director.buildMiPhone(phoneBuilder);
  12. Phone miPhone = phoneBuilder.getProduct();
  13. System.out.println("miPhone:" + miPhone.getName() + " | " + miPhone.getGpuType().toString());
  14. // 创建手册
  15. ManualBuilder manualBuilder = new ManualBuilder();
  16. director.buildMiPhone(manualBuilder);
  17. Manual manual = manualBuilder.getProduct();
  18. System.out.println("manual:" + manual.getName() + " | " + manual.getGpuType().toString());
  1.  

更多语言版本

不同语言实现设计模式:https://github.com/microwind/design-pattern

原文链接:https://www.cnblogs.com/letjs/p/17212355.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号