目录

  • 构建者模式是什么?
  • 为什么要用构建者模式?

构建者模式是什么?

简单来说,就是用于组装具有复杂结构的实例的模式。

什么意思呢?先来看个例子,比如现在有一个类TextBuilder用来创建一个文本内容,我们需要输入“大标题”、“小标题”、“内容”,用来构成这个文本内容。

public class TextBuilder {private StringBuffer buffer = new StringBuffer();// 先不看具体实现,只要知道需要依次调用一下方法,才能得到一个“文本内容”的实例public  void makeTitle(String title);public  void makeString(String str);public  void makeItems(String[] items);public  void close();
}

那么我们创建一个“文本内容”的实例就是这样的方式

import concrete_builder.TextBuilder;public class Test {public static void main(String[] args) {TextBuilder textBuilder = new TextBuilder();textBuilder.makeTitle("大标题");textBuilder.makeString("小标题");textBuilder.makeItems(new String[]{"内容1", "内容2"});textBuilder.close();// 好了,这时候的textBuilder才能正式使用}
}

其实以上出现了这样几个角色:

  1. 使用者(Client)
  2. 监工(Director)
  3. 具体的建造者(TextBuilder)

使用者很好理解,就是我们(main方法)。而监工,意思就是监督建造者干活的人,在这里是不是感觉也由我们(使用者)充当了这个角色,因为都是我们手动去监督textBuilder调用那些“建造方法”。具体的建造者当然就是指TextBuilder了。

混在一起就比较复杂了,下面用构建者模式将各个角色的职责分开。

抽象建造者:只定义构建复杂对象的方法,具体实现由子类完成

public abstract class Builder {public abstract void makeTitle(String title);public abstract void makeString(String str);public abstract void makeItems(String[] items);public abstract void close();
}

监工:用于指导如何调用建造者的方法去 按顺序完成复杂对象的构建

public class Director {private Builder builder;public Director(Builder builder) {this.builder = builder;}public void construct() {builder.makeTitle("Greeting");builder.makeString("从早上至下午");builder.makeItems(new String[]{"早上好。", "下午好。"});builder.makeString("晚上");builder.makeItems(new String[]{"晚上好", "晚安", "再见"});builder.close();}
}

具体的建造者:用什么样的结构来 组织监工传进来的内容。比如TextBuilder是用文本的形式,而HTMLBuilder是用Html的格式来构建。

public class TextBuilder extends Builder {private StringBuffer buffer = new StringBuffer();@Overridepublic void makeTitle(String title) {buffer.append("===============================\n");buffer.append("【" + title + "】\n");buffer.append("\n");}@Overridepublic void makeString(String str) {buffer.append("str:" + str + "\n");buffer.append("\n");}@Overridepublic void makeItems(String[] items) {for (int i = 0; i < items.length; i++) {buffer.append(" ." + items[i] + "\n");}buffer.append("\n");}@Overridepublic void close() {buffer.append("===============================\n");}public String getResult() {return buffer.toString();}
}
public class HTMLBuilder extends Builder {private String fileName;private PrintWriter writer;@Overridepublic void makeTitle(String title) {fileName = title + ".html";try {writer = new PrintWriter(new FileWriter(fileName));} catch (IOException e) {throw new RuntimeException(e);}writer.println("<html><head><title>" + title + "</title></head><body>");writer.println("<h1>" + title + "</h1>");}@Overridepublic void makeString(String str) {writer.println("<p>" + str + "</p>");}@Overridepublic void makeItems(String[] items) {writer.println("<ul>");for (int i = 0; i < items.length; i++) {writer.println("<li>" + items[i] + "</li>");}writer.println("</ul>");}@Overridepublic void close() {writer.println("</body></html>");writer.close();}public String getResult() {return fileName;}
}

使用者:只需要new好需要构建的复杂对象(这时候还是没内容的,是个空空如也的对象),然后丢给监工,监工指导一下构建者去完成复杂的组织过程,这时候我们再看这个复杂对象已经是组织好复杂内容的了。

public class Test {public static void main(String[] args) {TextBuilder textBuilder = new TextBuilder();Director director = new Director(textBuilder);director.construct();String result = textBuilder.getResult();System.out.println(result);}
}

这样看是不是简洁了很多,再来一个需要构建html形式的对象也没问题,往监工里面一丢,监工指导一下,直接就拿到有内容,有结构的复杂Html对象了。

但是这里就是有个问题,会发现这些复杂对象的内容都是一样的(在监工指导的时候写死了),只是创建出结构不同的对象而已。如果要内容不一样的话,印象中需要将在监工中读取的内容抽成properties文件,然后改配置文件即可,不用去改监工的代码。

为什么要用构建者模式?

我的理解:应该是将职责分开吧,这样将复杂对象的构建过程就会更加清晰一点,也算是解耦了。并且将监工(Director)和抽象建造者(Builder)作为可复用的组件使用。

设计模式-Builder模式(构建者模式)相关推荐

  1. sql中如何统计各种零件的总数量_如何应用GOF设计模式中的构建者模式创建复合对象实例...

    软件项目实训及课程设计指导--如何应用GOF设计模式中的构建者模式创建复合对象实例 1.GOF设计模式中的构建者模式 构建者设计模式能够将一个复杂对象(它一般为组合类)的构建过程与它的表示部件相互分离 ...

  2. 工厂模式 构建者模式_实践中的构建者模式

    工厂模式 构建者模式 我将不深入讨论该模式,因为已经有大量的文章和书籍对此进行了详细的解释. 相反,我将告诉您为什么以及何时应该考虑使用它. 但是,值得一提的是,这种模式与< 四人帮>一书 ...

  3. 火遍全网的Hutool,如何使用Builder模式构建线程池

    前言 Builder 设计模式也叫做 构建者模式或者建造者模式,名字只是一种叫法,当聊起三种名称的时候知道是怎么回事就行 Builder 设计模式在作者编码过程中,属于比较常用的模式之一.优秀的设计模 ...

  4. Builder构建者模式,将复杂对象的创建过程与其表示分离,活学活用才是王道

    首发CSDN:徐同学呀,原创不易,转载请注明源链接.我是徐同学,用心输出高质量文章,希望对你有所帮助. 文章目录 一.前言 传统创建对象的弊端 二.构建者模式 1.通用写法 2.构建者模式的优缺点 3 ...

  5. 设计模式----创建型设计模式(单例模式、工厂方法模式、构建者模式)

    创建型设计模式 单例模式(Singleton Pattern) 单例模式介绍 代码演示 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全, ...

  6. 原型模式 与 建造者模式

    一.原型模式 原型模式(Prototype Pattern)是指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,属于创建型模式. 原型模式的核心在于拷贝原型对象.以系统中已存在的一个对象 ...

  7. 设计模式-Builder模式

    目录 一个例子(做汤) 人工做汤 机器做汤(使用Builder模式) 优缺点 优点 缺点 Builder模式属于创建型模式. 它是将一个复杂对象的构建过程隐藏起来,让使用者只关系自己要生成什么样的对象 ...

  8. 设计模式(4)建造者模式/生成器模式(Builder)

    设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 设计模式(3)抽象工厂模式(Abstract Factory) 源 ...

  9. 构建器设计模式_创新设计模式:构建器模式

    构建器设计模式 以前我们看过工厂和抽象工厂模式. 这些模式可以达到目的,并且确实有用,但是在某些用例中,我们必须创建一个非常复杂的对象,并且创建它需要不同的步骤,每个步骤都需要不同的操作. 在这种情况 ...

最新文章

  1. [Google App Engine] Hello, world!
  2. .CN域名总量达1090.6万个:8月份共净增13.8万个
  3. Java技术:SpringBoot实现邮件发送功能
  4. P3901-数列找不同【模拟】
  5. TKmybatis和mybatisplus哪个好用
  6. [树状数组][二分] 洛谷 P2161 会场预约
  7. STM32F207通过FSMC读取ADC数据
  8. 读书笔记:《圈子圈套》
  9. java8-Stream集合操作学习
  10. 【Java常见面试题】JVM篇
  11. 解决idea打不开的两种可能性
  12. 把16进制值转换成颜色颜色16进制值表
  13. 提交代码时提示Could not read from remote repository.
  14. python画图基础
  15. 世界语到汉语和英语的自动翻译试验
  16. android sdk下载地址
  17. UA MATH524 复变函数1 复数及其基本性质
  18. 跨部门不配合工作_同事之间跨部门协作难如登天?做到这4点跨部门协作不难...
  19. 佳博便携式条码打印机怎么使用_佳博条码打印机打印模式设置问题
  20. 2022年G3锅炉水处理操作证考试题库模拟考试平台操作

热门文章

  1. python(函数)
  2. 有趣的计算机课的作文,有趣的电脑课_500字_作文素材大全
  3. springboot服务使用策略模式
  4. crashdump(crashdumps文件夹可以删除吗)
  5. vscode之神级插件整理(持续更新)
  6. 项目生命周期及其主要工作
  7. 安装MATHWORKS_R2018B
  8. Flutter (Material) - Scaffold
  9. Melty blood act cadenza Version B(附 OST) emule 下载
  10. LevelDB之Leveled-Compaction