当前位置:   article > 正文

大厦设计师 -- 建造者模式 (Builder Pattern) 介绍 使用案例场景分析 优缺点 及代码演示_builder案例分析

builder案例分析

一句话概括:

使用多个简单对象一步一步构建成复杂对象,将复杂对象的构建与表示相分离。

补充介绍:

建造者模式(Builder Pattern)中有一个 Builder 类,这个类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

建造者模式的目的是将复杂对象的构建与表示相分离,使同样的构建过程可以构建不同的表示。将复杂对象的变与不变相分开

建造高楼大厦时,需要打地基,搭建框架,浇灌混泥土,一层一层盖起来。建造高楼大厦就好比用Builder模式构建一个复杂对象。

肯德基的炸鸡汉堡薯条可乐,可以拼凑在一起成为一个套餐。

参与角色:

1)抽象建造类

2)建造类的实现类(多个不同实现类)

3)复杂对象类

优点:

1)建造者独立,易于扩展;

2)便于控制细节风险

缺点:

1)产品必须有共同点,范围有限制;

2)如果内部变化复杂,会有很多建造类

使用案例或场景:

使用场景:一个类的基本部件不会变,但是其组合一直变化的时候。

需要生成的对象具有复杂的内部结构,需要生成的对象内部本身相互依赖。

案例:肯德基麦当劳的基本食品:汉堡,薯条,炸鸡,可乐…这些东西是不会变得,但是套餐却各种玩法都有,所以可以通过这些基本对象去构建一个复杂对象。Java中的StringBuilder,是根据基本字符串构建出一个复杂字符串。还有Spring Boot 启动类中的SpringApplication对象也是通过builder构建出来的,Spring Cloud Stream中的消息对象,也是builder出来的。

示例程序

需要源码的朋友可以前往github下载:

https://github.com/aharddreamer/chendong/tree/master/design-patterns/demo-code/design-patterns

程序简介

我们来看一段使用Builder模式编写文档的程序,编写出的文档具有以下结构:

1)含有一个标题;

2)含有几个字符串

3)含有条目项目

Builder类种定义了决定文档结构的方法,然后Director类使用该方法编写一个具体的文档。

Builder类是抽象类,它并没有进行任何实际的处理,仅仅声明了抽象方法。Builder类的子类决定了用来编写文档的具体处理。

在示例程序中,我们定义了以下Builder类的子类。

TextBuilder类:使用纯文本(普通字符串)编写文档

HTMLBuilder类: 使用HTML编写文档

 

类清单:

Builder 定义了决定文档结构的方法的抽象类

Director 编写一个文档的类

TextBuilder 使用纯文本编写文档的类

HTMLBuilder 使用HTML编写文档的类

BuilderPatternTest 测试类

 

代码:
 

  1. public abstract class Builder {
  2. public abstract void makeTitle(String title);
  3. public abstract void makeString(String str);
  4. public abstract void makeItems(String[] items);
  5. public abstract void close();
  6. }
  7. public class Director {
  8. private Builder builder;
  9. public Director (Builder builder) {
  10. this.builder = builder;
  11. }
  12. public void construct() {
  13. //编写文档
  14. builder.makeTitle("美好的一天");
  15. builder.makeString("从早上到下午");
  16. builder.makeItems(new String[]{
  17. "早上好",
  18. "下午好",
  19. });
  20. builder.makeString("晚上");
  21. builder.makeItems(new String[]{
  22. "晚上好",
  23. "晚安",
  24. });
  25. //完成文档
  26. builder.close();
  27. }
  28. }
  29. public class TextBuilder extends Builder {
  30. private StringBuilder buffer = new StringBuilder();
  31. @Override
  32. public void makeTitle(String title) {
  33. buffer.append("==============Start Text Document===============\n");
  34. buffer.append("《");
  35. buffer.append(title);
  36. buffer.append("》");
  37. buffer.append("\n");
  38. }
  39. @Override
  40. public void makeString(String str) {
  41. buffer.append(str);
  42. buffer.append("\n");
  43. }
  44. @Override
  45. public void makeItems(String[] items) {
  46. for (int i = 0; i < items.length ; i++) {
  47. buffer.append(" ·" + items[i] + "\n");
  48. }
  49. buffer.append("\n");
  50. }
  51. @Override
  52. public void close() {
  53. buffer.append("==============End Text Document===============\n");
  54. }
  55. public String getResult() {
  56. return buffer.toString();
  57. }
  58. }
  59. public class HTMLBuilder extends Builder {
  60. private StringBuilder buffer = new StringBuilder();
  61. @Override
  62. public void makeTitle(String title) {
  63. buffer.append("==============Start HTML Document===============\n");
  64. buffer.append("<h1>");
  65. buffer.append(title);
  66. buffer.append("</h1>");
  67. buffer.append("\n");
  68. }
  69. @Override
  70. public void makeString(String str) {
  71. buffer.append("<p>");
  72. buffer.append(str);
  73. buffer.append("</p>");
  74. buffer.append("\n");
  75. }
  76. @Override
  77. public void makeItems(String[] items) {
  78. buffer.append("<ur>");
  79. buffer.append("\n");
  80. for (int i = 0; i < items.length ; i++) {
  81. buffer.append("<li>" + items[i] + "</li>\n");
  82. }
  83. buffer.append("</ur>");
  84. buffer.append("\n");
  85. }
  86. @Override
  87. public void close() {
  88. buffer.append("==============End HTML Document===============\n");
  89. }
  90. public String getResult() {
  91. return buffer.toString();
  92. }
  93. }
  94. public class BuilderPatternTest {
  95. public static void main(String[] args) {
  96. //Text Builder
  97. TextBuilder textBuilder = new TextBuilder();
  98. Director director = new Director(textBuilder);
  99. director.construct();
  100. String result = textBuilder.getResult();
  101. System.out.println(result);
  102. System.out.println();
  103. System.out.println();
  104. //HTML Builder
  105. HTMLBuilder htmlBuilder = new HTMLBuilder();
  106. director = new Director(htmlBuilder);
  107. director.construct();
  108. String htmlResult = htmlBuilder.getResult();
  109. System.out.println(htmlResult);
  110. }
  111. }

运行结果

==============Start Text Document===============
《美好的一天》
从早上到下午
 ·早上好
 ·下午好

晚上
 ·晚上好
 ·晚安

==============End Text Document===============

 

==============Start HTML Document===============
<h1>美好的一天</h1>
<p>从早上到下午</p>
<ur>
<li>早上好</li>
<li>下午好</li>
</ur>
<p>晚上</p>
<ur>
<li>晚上好</li>
<li>晚安</li>
</ur>
==============End HTML Document===============

 

参考:

《建造者模式》菜鸟教程网站

《图解设计模式》【日】结城浩著

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/468585
推荐阅读
相关标签
  

闽ICP备14008679号