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. bash shell for循环

    1 同c一样用四个空格进行缩进 2 每行一条语句,不用分号 3 不用大括号标识代码块,但是要用do/done来标识代码块 4 用双小括号,类似于c的for进行编码 for ((i=1; i<=1 ...

  2. [2019杭电多校第十场][hdu6701]Make Rounddog Happy

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6701 题目大意为求满足 $max(a_{l},a_{l+1}\cdot \cdot \cdot a_{ ...

  3. 通过设置代理解决AndroidStudio无法下载gradle问题

    一.AndroidStudio代理 我们平时在使用android studio时,难免需要从android官网下载一些项目运行所需要的SDK文件,但是因为android官网在国外,访问起来会比较慢,所 ...

  4. C#设计模式:命令模式(Command Pattern)

    一,什么是命令模式(Command Pattern)? 命令模式:将请求封装成命令对象,请求的具体执行由命令接收者执行: 二,如下代码 using System; using System.Colle ...

  5. jquery点击按钮弹出图片

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  6. idea 创建java web项目ssm-gradle

    环境准备:jdk1.8+tomcat8+idea+gradle 1.创建项目SSM 使用gradle创建项目,按照提示如下   image.png 输入项目名称,组名   image.png   im ...

  7. python连接mariadb报错解决1045, "Access denied for user 'root'@'192.168.0.50' (using password: YES)

    [root@localhost ~]# python Python 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Ha ...

  8. openstack stein部署手册 4. glance

    # 建立数据库用户及权限 create database glance; grant all privileges on glance.* to glance@'localhost' identifi ...

  9. jpype测试报错,找不到类raise _RUNTIMEEXCEPTION.PYEXC("Class %s not found" % name)

    最近用jpype测试java代码 公司电脑跑着没有问题,家里电脑怎么也不行,python,jdk版本啥的都一样,但总是报找不到类名的错误 raise _RUNTIMEEXCEPTION.PYEXC(& ...

  10. 【LeetCode】动态规划(下篇共39题)

    [600] Non-negative Integers without Consecutive Ones [629] K Inverse Pairs Array [638] Shopping Offe ...