《图解设计模式》读书笔记3-3 Builder模式
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模式的更多相关文章
- HeadFirst设计模式读书笔记(3)-装饰者模式(Decorator Pattern)
装饰者模式:动态地将责任附件到对象上.若要扩展功能,装饰者提东了比继承更有弹性的替代方案. 装饰者和被装饰对象有相同的超类型 你可以用一个或者多个装饰者包装一个对象. 既然装饰者和被装饰对象有相同的超 ...
- HeadFirst设计模式读书笔记--目录
HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...
- Head First 设计模式读书笔记(1)-策略模式
一.策略模式的定义 策略模式定义了算法族,分别封装起来,让它们之间可以互换替换,此模式让算法的变化独立使用算法的客户. 二.使用策略模式的一个例子 2.1引出问题 某公司做了一套模拟鸭子的游戏:该游戏 ...
- JavaScript设计模式:读书笔记(未完)
该篇随我读书的进度持续更新阅读书目:<JavaScript设计模式> 2016/3/30 2016/3/31 2016/4/8 2016/3/30: 模式是一种可复用的解决方案,可用于解决 ...
- Java设计模式学习笔记(三) 工厂方法模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...
- C#设计模式学习笔记:(4)建造者模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7614630.html,记录一下学习过程以备后续查用. 一.引言 在现实生活中,我们经常会遇到一些构成比较复杂 ...
- 图解http读书笔记
以前对HTTP协议一知半解,一直不清楚前端需要对于HTTP了解到什么程度,知道接触的东西多了,对于性能优化.服务端的配合和学习中也渐渐了解到了HTTP基础的重要性,看了一些大神对HTTP书籍的推荐,也 ...
- Java设计模式学习笔记(二) 简单工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...
- Java设计模式学习笔记(四) 抽象工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...
- C#设计模式学习笔记:(23)解释器模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8242238.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第十一个模式-- ...
随机推荐
- JS 数组的常用方法归纳之不改变原数组和其他
不改变原数组的方法 concat() 连接两个或多个数组,不改变现有数组,返回新数组,添加的是数组中的元素 join(",") 把数组中的所有元素放入一个字符串,通过‘,’分隔符进 ...
- Java相关面试题总结+答案(八)
[RabbitMQ] 135. RabbitMQ 的使用场景有哪些? 抢购活动,削峰填谷,防止系统崩塌. 延迟信息处理,比如 10 分钟之后给下单未付款的用户发送邮件提醒. 解耦系统,对于新增的功能可 ...
- 设计模式:单例模式(Singletion)
单例模式(Singletion):保证一个类仅有一个实例,并提供一个访问该实例的全局访问点. 单例模式主要作用是保证唯一的实例,可以严格地控制客户端怎样访问该实例以及何时访问它.可以简单的理解为对唯一 ...
- Ftp客户端(上传文件)
#coding=utf-8 import os import socket import hashlib import json # client = socket.socket() #申明socke ...
- IIS是怎么处理多个请求的?
一,假设有一台服务器,它的IIS上部署有一个Web应用程序-S,可以通过浏览器或其他方式进行访问. 假设有A.B.C三台电脑同时访问网站S,IIS接收到3个HTTP请求,然后分别为三个请求 ...
- svn登录问题
转载自: https://www.cnblogs.com/WQX-work24/p/9790260.html 版权归该作者所有.
- Python的五大数据类型的作用、定义方式、使用方法
一.简述Python的五大数据类型的作用.定义方式.使用方法: 1. 数字类型int: 1.整形 作用:可以表示人的年龄,身份证号码,身高和体重等 定义方式: weight = 130 print( ...
- CSS中如何设置父元素透明度不影响子元素透明度
原因分析: 使用css的opcity属性改变某个元素的透明度,但是其元素下的子元素的透明度也会被改变,即便重定义也没有用,不过有个方法可以实现,大家可以看看. 可以使用一张透明的图片做背景可以达成效果 ...
- Install.php
<!DOCTYPE html><html lang="en"><head> <meta charset="utf-8" ...
- git 日常 常用命令
初始化git git init 第一次拉代码: 方式1:git clone git clone https://git.oschina.net/*****.git (https远程仓库地址) 方式2: ...