当前位置:   article > 正文

java的23种设计模式04-创建型模式03-生成器

java的23种设计模式04-创建型模式03-生成器

一、定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

生成器模式(Builder)是使用多个“小型”工厂来最终创建出一个完整对象。

当我们使用Builder的时候,一般来说,是因为创建这个对象的步骤比较多,每个步骤都需要一个零部件,最终组合成一个完整的对象。

二、示例

我们仍然以Markdown转HTML为例,因为直接编写一个完整的转换器比较困难,因此,我们把Markdown转HTML看作一行一行的转换,每一行根据语法,使用不同的转换器:

  • 如果以#开头,使用HeadingBuilder转换;
  • 如果以>开头,使用QuoteBuilder转换;
  • 如果以---开头,使用HrBuilder转换;
  • 其余使用ParagraphBuilder转换。

这个HtmlBuilder写出来如下:

  1. public class HtmlBuilder {
  2. private HeadingBuilder headingBuilder = new HeadingBuilder();
  3. private HrBuilder hrBuilder = new HrBuilder();
  4. private ParagraphBuilder paragraphBuilder = new ParagraphBuilder();
  5. private QuoteBuilder quoteBuilder = new QuoteBuilder();
  6. public String toHtml(String markdown) {
  7. StringBuilder buffer = new StringBuilder();
  8. markdown.lines().forEach(line -> {
  9. if (line.startsWith("#")) {
  10. buffer.append(headingBuilder.buildHeading(line)).append('\n');
  11. } else if (line.startsWith(">")) {
  12. buffer.append(quoteBuilder.buildQuote(line)).append('\n');
  13. } else if (line.startsWith("---")) {
  14. buffer.append(hrBuilder.buildHr(line)).append('\n');
  15. } else {
  16. buffer.append(paragraphBuilder.buildParagraph(line)).append('\n');
  17. }
  18. });
  19. return buffer.toString();
  20. }
  21. }

上述代码,HtmlBuilder并不是一次性把整个Markdown转换为HTML,而是一行一行转换,并且,它自己并不会将某一行转换为特定的HTML,而是根据特性把每一行都“委托”给一个XxxBuilder去转换,最后,把所有转换的结果组合起来,返回给客户端。

这样一来,我们只需要针对每一种类型编写不同的Builder。例如,针对以#开头的行,需要HeadingBuilder:

  1. public class HeadingBuilder {
  2. public String buildHeading(String line) {
  3. int n = 0;
  4. while (line.charAt(0) == '#') {
  5. n++;
  6. line = line.substring(1);
  7. }
  8. return String.format("<h%d>%s</h%d>", n, line.strip(), n);
  9. }
  10. }

可见,使用Builder模式时,适用于创建的对象比较复杂,最好一步一步创建出“零件”,最后再装配起来。

很多时候,我们可以简化Builder模式,以链式调用的方式来创建对象。例如,我们经常编写这样的代码:

  1. StringBuilder builder = new StringBuilder();
  2. builder.append(secure ? "https://" : "http://")
  3. .append("www.liaoxuefeng.com")
  4. .append("/")
  5. .append("?t=0");
  6. String url = builder.toString();

三、小结

Builder模式是为了创建一个复杂的对象,需要多个步骤完成创建,或者需要多个零件组装的场景,且创建过程中可以灵活调用不同的步骤或组件。

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

闽ICP备14008679号