经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
创建型模式————建造者模式(2.4)
来源:cnblogs  作者:noneplus  时间:2019/8/15 12:15:07  对本文有异议

什么是建造者模式?

工厂模式聚焦于创建出一个对象,而建造者除此之外还需要为创建的对象赋值。

简单来说,建造者模式=创建对象+属性赋值。


建造者模式应用场景

建造者模式适合创建类中包含多个参数且需要定制化的情况。

简单来说,建造者模式的目的就是创造一条龙服务:不仅创建出对象,顺便给属性赋值。


以计算机为例,计算机的性能大致由CPU,显卡,内存,硬盘这几个属性构成。

市面上更多的是已经组装好的成品,而不会让用户自己去配一台电脑出来。(当然自己也是可以配的)


市场根据需求分为游戏本,办公本以及娱乐本等等。不同的种类性能是不一样的。但会在一个大致的范畴。

如果将所有的CPU,显卡,硬盘等等排列组合,电脑的种类将难以计数。所以官方推出定制本不仅缩小了选择的难度。也提供了生产的方便。


写个Demo实现:

虚线以上可以理解为服务端,一下可以理解为客户端。

那么生产一个产品的流程大致是这样的:实例化一个建造者实现类和一个指挥者装配类,调用指挥者转配类中的build方法实现建造者实现类的setter方法从而达到实例化产品的目的。


为什么需要建造者接口类和建造者实现类?

接口类控制的是产品的生产标准(实例化标准),每一个具体的产品都需要实现该接口完成产品创建。

优点:提升了扩展性。(客户端也可以通过接口的实现来创建自定义产品)


为什么需要指挥者装配类?

调用建造者实用类的setter方法即可完成产品的实例化创建,但这一部分对于每一个产品来说都是相同的。

那么在实例化产品的过程中,完全可以把这个重复且无任何变化的过程封装起来。实现代码复用。

  1. class Computer //产品类
  2. {
  3. private String cpu;
  4. private String gpu;
  5. private String memory;
  6. private String hardpan;
  7. public String getCpu() {
  8. return cpu;
  9. }
  10. public void setCpu(String cpu) {
  11. this.cpu = cpu;
  12. }
  13. public String getGpu() {
  14. return gpu;
  15. }
  16. public void setGpu(String gpu) {
  17. this.gpu = gpu;
  18. }
  19. public String getMemory() {
  20. return memory;
  21. }
  22. public void setMemory(String memory) {
  23. this.memory = memory;
  24. }
  25. public String getHardpan() {
  26. return hardpan;
  27. }
  28. public void setHardpan(String hardpan) {
  29. this.hardpan = hardpan;
  30. }
  31. @Override
  32. public String toString() {
  33. return "Computer{" +
  34. "cpu='" + cpu + '\'' +
  35. ", gpu='" + gpu + '\'' +
  36. ", memory='" + memory + '\'' +
  37. ", hardpan='" + hardpan + '\'' +
  38. '}';
  39. }
  40. }
  41. interface ComputerBuilder //建造者接口类
  42. {
  43. void setCpu();
  44. void setGpu();
  45. void setMemeory();
  46. void setHardpan();
  47. Computer build();
  48. }
  49. class Hp_Game implements ComputerBuilder //建造者实现类
  50. {
  51. private Computer computer=new Computer();
  52. @Override
  53. public void setCpu() {
  54. computer.setCpu("i7 8300");
  55. }
  56. @Override
  57. public void setGpu() {
  58. computer.setGpu("rtx1080i");
  59. }
  60. @Override
  61. public void setMemeory() {
  62. computer.setMemory("32g");
  63. }
  64. @Override
  65. public void setHardpan() {
  66. computer.setHardpan("500G m2");
  67. }
  68. @Override
  69. public Computer build() {
  70. return computer;
  71. }
  72. }
  73. class Hp_Work implements ComputerBuilder
  74. {
  75. private Computer computer=new Computer();
  76. @Override
  77. public void setCpu() {
  78. computer.setCpu("i6 7300");
  79. }
  80. @Override
  81. public void setGpu() {
  82. computer.setGpu("MX250");
  83. }
  84. @Override
  85. public void setMemeory() {
  86. computer.setMemory("4g");
  87. }
  88. @Override
  89. public void setHardpan() {
  90. computer.setHardpan("500G SATA");
  91. }
  92. @Override
  93. public Computer build() {
  94. return computer;
  95. }
  96. }
  97. class ComputerDirector //指挥者装配类
  98. {
  99. public Computer build(ComputerBuilder cb)
  100. {
  101. cb.setCpu();
  102. cb.setGpu();
  103. cb.setMemeory();
  104. cb.setHardpan();
  105. return cb.build();
  106. }
  107. }
  108. //=============================
  109. public class APPlication
  110. {
  111. public static void main(String[] args) {
  112. Hp_Game hp01 = new Hp_Game();
  113. Hp_Work hp02 = new Hp_Work();
  114. ComputerDirector computerDirector = new ComputerDirector();
  115. Computer computer_hp1=computerDirector.build(hp01);
  116. System.out.println(computer_hp1);
  117. Computer computer_hp02 =computerDirector.build(hp02);
  118. System.out.println(computer_hp02);
  119. }
  120. }

客户端扩展一个产品实例

定义一个建造者实现类实现建造者接口类,并完成setter定制即可。

  1. class Computer //产品类
  2. {
  3. private String cpu;
  4. private String gpu;
  5. private String memory;
  6. private String hardpan;
  7. public String getCpu() {
  8. return cpu;
  9. }
  10. public void setCpu(String cpu) {
  11. this.cpu = cpu;
  12. }
  13. public String getGpu() {
  14. return gpu;
  15. }
  16. public void setGpu(String gpu) {
  17. this.gpu = gpu;
  18. }
  19. public String getMemory() {
  20. return memory;
  21. }
  22. public void setMemory(String memory) {
  23. this.memory = memory;
  24. }
  25. public String getHardpan() {
  26. return hardpan;
  27. }
  28. public void setHardpan(String hardpan) {
  29. this.hardpan = hardpan;
  30. }
  31. @Override
  32. public String toString() {
  33. return "Computer{" +
  34. "cpu='" + cpu + '\'' +
  35. ", gpu='" + gpu + '\'' +
  36. ", memory='" + memory + '\'' +
  37. ", hardpan='" + hardpan + '\'' +
  38. '}';
  39. }
  40. }
  41. interface ComputerBuilder //建造者接口类
  42. {
  43. void setCpu();
  44. void setGpu();
  45. void setMemeory();
  46. void setHardpan();
  47. Computer build();
  48. }
  49. class Hp_Game implements ComputerBuilder //建造者实现类
  50. {
  51. private Computer computer=new Computer();
  52. @Override
  53. public void setCpu() {
  54. computer.setCpu("i7 8300");
  55. }
  56. @Override
  57. public void setGpu() {
  58. computer.setGpu("rtx1080i");
  59. }
  60. @Override
  61. public void setMemeory() {
  62. computer.setMemory("32g");
  63. }
  64. @Override
  65. public void setHardpan() {
  66. computer.setHardpan("500G m2");
  67. }
  68. @Override
  69. public Computer build() {
  70. return computer;
  71. }
  72. }
  73. class Hp_Work implements ComputerBuilder
  74. {
  75. private Computer computer=new Computer();
  76. @Override
  77. public void setCpu() {
  78. computer.setCpu("i6 7300");
  79. }
  80. @Override
  81. public void setGpu() {
  82. computer.setGpu("MX250");
  83. }
  84. @Override
  85. public void setMemeory() {
  86. computer.setMemory("4g");
  87. }
  88. @Override
  89. public void setHardpan() {
  90. computer.setHardpan("500G SATA");
  91. }
  92. @Override
  93. public Computer build() {
  94. return computer;
  95. }
  96. }
  97. class ComputerDirector //指挥者,复制给属性赋值
  98. {
  99. public Computer build(ComputerBuilder cb)
  100. {
  101. cb.setCpu();
  102. cb.setGpu();
  103. cb.setMemeory();
  104. cb.setHardpan();
  105. return cb.build();
  106. }
  107. }
  108. //=============================
  109. class Dell_Game implements ComputerBuilder
  110. {
  111. private Computer computer=new Computer();
  112. @Override
  113. public void setCpu() {
  114. computer.setCpu("i7 9300");
  115. }
  116. @Override
  117. public void setGpu() {
  118. computer.setGpu("GTX1090");
  119. }
  120. @Override
  121. public void setMemeory() {
  122. computer.setMemory("32g");
  123. }
  124. @Override
  125. public void setHardpan() {
  126. computer.setHardpan("500G m2");
  127. }
  128. @Override
  129. public Computer build() {
  130. return computer;
  131. }
  132. }
  133. public class APPlication
  134. {
  135. public static void main(String[] args) {
  136. // Hp_Game hp01 = new Hp_Game();
  137. // Hp_Work hp02 = new Hp_Work();
  138. ComputerDirector computerDirector = new ComputerDirector();
  139. // Computer computer_hp1=computerDirector.build(hp01);
  140. // System.out.println(computer_hp1);
  141. //
  142. // Computer computer_hp02 =computerDirector.build(hp02);
  143. // System.out.println(computer_hp02);
  144. Dell_Game dell_game = new Dell_Game();
  145. Computer computer_Dell_game = computerDirector.build(dell_game);
  146. System.out.println(computer_Dell_game);
  147. }
  148. }

小结

建造者模式的目的是创建对象并给属性赋值;

换个角度思考,实现接口的建造者实现类在定义的时候就是为了实现产品类的(而具体的产品类是固定的)。所以这个类本身的目的就是为了实例化另外一个类。而指挥者通过调用这个类的setter方法完成对产品类的属性赋值。


建造者模式的核心目的是创建出带有实例化属性的对象,而且有良好的扩展性。(符合开闭原则)

建造者要建造啥——开箱即用的产品。

原文链接:http://www.cnblogs.com/noneplus/p/11342846.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号