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. vsphere虚拟化之Active Directory域的创建(一)

    1.搭建环境说明 本机是在Vmware Workstation 12 Pro虚拟软件下进行搭建的. 操作系统版本:Windows Server 2012 R2 简体中文企业版x64. 2.安装完win ...

  2. quartz任务调度的详解

    1.Quartz包含3个核心(调度器.作业类.触发器) (1).作业类:只需要实现org.quartz.job接口,同时包含里面的一个方法体execute()[这是被调度的作业体] (2).调度器:是 ...

  3. jdk与eclipse安装注意事项

    1.安装这两个软件,一定要注意使得两个软件的版本是一致的: 1.1编写小程序测试jdk的版本号: public class Text{ public static void main(String[] ...

  4. SpringCloud Erueka配置异常

    com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known serve ...

  5. Leetcode Lect3 内存中的栈空间与堆空间

    内存中的栈空间与堆空间 我们通常所说的内存空间,包含了两个部分:栈空间(Stack space)和堆空间(Heap space) 当一个程序在执行的时候,操作系统为了让进程可以使用一些固定的不被其他进 ...

  6. 浏览器是怎样工作的:渲染引擎,HTML解析(连载二)

    转载自:http://ued.ctrip.com/blog/how-browsers-work-rendering-engine-html-parsing-series-ii.html 渲染引擎 渲染 ...

  7. 并发工具CountDownLatch源码分析

    CountDownLatch的作用类似于Thread.join()方法,但比join()更加灵活.它可以等待多个线程(取决于实例化时声明的数量)都达到预期状态或者完成工作以后,通知其他正在等待的线程继 ...

  8. C++ CMake 入门实战[转载]

    C++ CMake 入门实战 2016-11-05 CMake用于跨平台的编译系统,对于通常的c/c++工程,都是通过make来进行编译的,CMake可以通过指令生成Makefile文件来指导整个项目 ...

  9. Maya2014下载安装与激活

    目录 1. 更多推荐 2. 下载地址 2.1. OneDrive 2.2. 其他下载地址 3. 激活步骤 1. 更多推荐 其他Maya版本的下载与激活:https://www.cnblogs.com/ ...

  10. Taro -- 微信小程序wxParse达到html转换wxml

    Taro微信小程序可以用wxParse来达到html转换wxml的效果:https://github.com/NervJS/taro-components-test/blob/master/src/p ...