Builder模式即建造者模式,利用这个模式可以组装具有复杂结构的实例

示例程序

使用Builder模式创建一个文档,文档有标题,句子和几个条目。

Builder是抽象类,定义了文档的结构。继承Builder的子类实现了具体的方法。

我们定义了两个Builder的子类:TextBuilder和MarkdownBuilder,分别构造txt文档和markdown文档。

类图

代码

抽象类Builder,定义了文档结构的构建方法,但未实现。

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();
}

Director类,使用Builder中声明的方法构建一个文档

public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void construct() {
builder.makeTitle("文章标题");
builder.makeString("第1句话");
builder.makeItems(new String[]{"条目1", "条目2"});
builder.makeString("第2句话");
builder.makeItems(new String[]{"条目3", "条目4"});
builder.close();
}
}

两个具体的Builder类,实现了构建方法

public class TextBuilder extends Builder {
private StringBuffer sb = new StringBuffer();
@Override
public void makeTitle(String title) {
sb.append("========================\n");
sb.append("[" + title + "]\n");
sb.append("\n");
}
@Override
public void makeString(String str) {
sb.append("■"+str+"\n");
}
@Override
public void makeItems(String[] items) {
for (int i = 0; i < items.length; i++) {
sb.append("~"+items[i]+"\n");
}
}
@Override
public void close() {
sb.append("========================\n");
}
public String getResult() {
return sb.toString();
}
}
public class MarkdownBuilder extends Builder {
private StringBuffer sb = new StringBuffer(); @Override
public void makeTitle(String title) {
sb.append("========================\n");
sb.append("# " + title + "\n");
sb.append("\n");
} @Override
public void makeString(String str) {
sb.append("> "+str+"\n");
} @Override
public void makeItems(String[] items) {
for (int i = 0; i < items.length; i++) {
sb.append("- "+items[i]+"\n");
}
} @Override
public void close() {
sb.append("========================\n");
} public String getResult() {
return sb.toString();
}
}

使用

//构建txt文档
TextBuilder textBuilder = new TextBuilder();
Director director1 = new Director(textBuilder);
director1.construct();
System.out.println(textBuilder.getResult());
//构建Markdown文档
MarkdownBuilder markdownBuilder = new MarkdownBuilder();
Director director2 = new Director(markdownBuilder);
director2.construct();
System.out.println(markdownBuilder.getResult()); //结果
========================
[文章标题] ■第1句话
~条目1
~条目2
■第2句话
~条目3
~条目4
======================== ========================
# 文章标题 > 第1句话
- 条目1
- 条目2
> 第2句话
- 条目3
- 条目4
========================

角色

Builder(建造者):负责定义用于生成实例的API。

ConcreteBuilder(具体的建造者):负责实现用于生成实例的API。

Director(导演):负责使用API生成实例。它只调用在Builder中定义的API。

Client(使用者):在本例中就是执行程序的Main方法。

Builder模式的类图

思路拓展

谁知道什么

Main类不知道Builder类是什么。

Director类也不知道自己调用的是哪个具体的Builder类。

这些“不知道”有好处,因为只有不知道的子类才可以替换,可替换体现了模块化,低耦合的思想。

构造和实现分离

Director负责构建方法的调用,相当于实现一个构建的过程;ConcreteBuilder负责构建方法的实现。如果构建过程复杂,构建方法繁琐,这样分离出来的好处显而易见。Director不需要担心复杂的具体实现,只用关心怎么调用就行。

和Template Method模式的区别和联系?

Template Method模式是父类定义方法,父类决定方法的调用方式,子类实现方法。

Builder模式是Builder定义方法,ConcreteBuilder实现方法,Director决定方法的调用方式。前者的父类相当于Builder和Director的结合体,后者将父类的角色拆开,分成了定义者和使用者,有点职责分离的意味。(个人不成熟的想法,欢迎留言讨论)

《图解设计模式》读书笔记3-3 Builder模式的更多相关文章

  1. HeadFirst设计模式读书笔记(3)-装饰者模式(Decorator Pattern)

    装饰者模式:动态地将责任附件到对象上.若要扩展功能,装饰者提东了比继承更有弹性的替代方案. 装饰者和被装饰对象有相同的超类型 你可以用一个或者多个装饰者包装一个对象. 既然装饰者和被装饰对象有相同的超 ...

  2. HeadFirst设计模式读书笔记--目录

    HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...

  3. Head First 设计模式读书笔记(1)-策略模式

    一.策略模式的定义 策略模式定义了算法族,分别封装起来,让它们之间可以互换替换,此模式让算法的变化独立使用算法的客户. 二.使用策略模式的一个例子 2.1引出问题 某公司做了一套模拟鸭子的游戏:该游戏 ...

  4. JavaScript设计模式:读书笔记(未完)

    该篇随我读书的进度持续更新阅读书目:<JavaScript设计模式> 2016/3/30 2016/3/31 2016/4/8 2016/3/30: 模式是一种可复用的解决方案,可用于解决 ...

  5. Java设计模式学习笔记(三) 工厂方法模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...

  6. C#设计模式学习笔记:(4)建造者模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7614630.html,记录一下学习过程以备后续查用. 一.引言 在现实生活中,我们经常会遇到一些构成比较复杂 ...

  7. 图解http读书笔记

    以前对HTTP协议一知半解,一直不清楚前端需要对于HTTP了解到什么程度,知道接触的东西多了,对于性能优化.服务端的配合和学习中也渐渐了解到了HTTP基础的重要性,看了一些大神对HTTP书籍的推荐,也 ...

  8. Java设计模式学习笔记(二) 简单工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...

  9. Java设计模式学习笔记(四) 抽象工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...

  10. C#设计模式学习笔记:(23)解释器模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8242238.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第十一个模式-- ...

随机推荐

  1. RocketMQ的消息发送及消费

    RocketMQ消息支持的模式: 消息支持的模式分为三种:NormalProducer(普通同步),消息异步发送,OneWay. 消息同步发送: 普通消息的发送和接收在前面已经演示过了,在前面的案例中 ...

  2. Maven构建SpringMVC+Mybatis项目

    1.创建Maven项目时,起始是没有src/main/java.src/test/java.src/test/resources,需要修改一些配置之后,自动就会创建出来: 2.开始引入Spring+M ...

  3. spring-第十六篇之AOP面向切面编程之Spring AOP

    1.上一篇介绍了AspectJ在AOP的简单应用,让我们了解到它的作用就是:开发者无需修改源代码,但又可以为这些组件的方法添加新的功能. AOP的实现可分为两类(根据AOP修改源码的时机划分): 1& ...

  4. ISC2016训练赛 phrackCTF--findkey

    测试文件:https://static2.ichunqiu.com/icq/resources/fileupload/phrackCTF/REVERSE/findkey 1.准备 获得信息 Pytho ...

  5. java 快速开发平台 有代码生成器 springmvc SSM后台框架源码

    .   权限管理:点开二级菜单进入三级菜单显示 角色(基础权限)和按钮权限      角色(基础权限): 分角色组和角色,独立分配菜单权限和增删改查权限.      按钮权限: 给角色分配按钮权限.2 ...

  6. 2019-4-21-Roslyn-通过-NuGet-库修改应用程序入口函数

    title author date CreateTime categories Roslyn 通过 NuGet 库修改应用程序入口函数 lindexi 2019-4-21 17:37:1 +0800 ...

  7. 一条sql引发的“血案”

    前几天有一个项目要上线,需要对表的一个字段进行扩充,项目经理让我准备脚本,于是我准备了如下的脚本: )); )); )); 结果上线的时候,ord_log1和ord_log2表中有30万数据,在执行的 ...

  8. 字符串format函数使用

    #format拼接字符串,format()内的参数必须为可迭代的对象p1="i am {2},age {1},{0}".format("seven",18,'a ...

  9. vue2.0  之 directive指令 (自定义)

    指令 一.定义: 指令只一种可以附加到DOM元素的微命令(tiny commands). 它们通常以"v-"作为前缀, 以方便Vue知道你在使用一种特殊的标记, 从而确保语法的一致 ...

  10. php io

    1.获取目录下文件,不包括子目录 //获取某目录下所有文件.目录名(不包括子目录下文件.目录名) $handler = opendir($dir); while (($filename = readd ...