设计模式学习笔记——建造者(Builder)模式

@(设计模式)[设计模式, 建造者模式, builder]

  • 设计模式学习笔记建造者Builder模式

    • 基本介绍
    • 建造者案例
      • 类图
      • 实现代码
        • Builder抽象类
        • Director类
        • TextBuilder类
        • HTMLBuilder类
        • 测试类
        • 测试方法
          • 运行结果
        • 测试方法
          • 运行结果

            • 控制台输出
            • E盘下Greetinghtml的内容
            • 浏览器中运行结果
    • 建造者模式中的角色
      • Builder建造者
      • ConcreteBuilder具体的建造者
      • Director监工
      • Client使用者
      • 类图
      • 时序图

基本介绍

建造者模式的最主要思想是:将分散的各个组件,组装起来,形成一个整体。

建造者案例

类图

实现代码

Builder抽象类

package com.pc.builder.example;import java.util.List;/*** 建造者类* Created by Switch on 2017-02-13.*/
public abstract class Builder {/*** 创建标题** @param title 标题*/public abstract void makeTitle(String title);/*** 创建字符串** @param str 字符串*/public abstract void makeString(String str);/*** 创建条目** @param items 条目列表*/public abstract void makeItems(List<String> items);/*** 关闭*/public abstract void close();
}

Director类

package com.pc.builder.example;import java.util.ArrayList;
import java.util.List;/*** 导演类* Created by Switch on 2017-02-13.*/
public class Director {// builder对象private Builder builder;/*** 构造方法,传入builder对象** @param builder 建造者对象*/public Director(Builder builder) {this.builder = builder;}/*** 构建文档*/public void construct() {// 创建标题builder.makeTitle("Greeting");// 创建字符串builder.makeString("Switch");// 创建条目List<String> list1 = new ArrayList<>();list1.add("早上好");list1.add("中午好");list1.add("晚上好");builder.makeItems(list1);// 创建字符串builder.makeString("Kity");// 创建条目List<String> list2 = new ArrayList<>();list2.add("晚上好");list2.add("中午好");list2.add("早上好");builder.makeItems(list2);// 完成,关闭文档builder.close();}
}

TextBuilder类

package com.pc.builder.example;import java.util.List;/*** 文本Builder* Created by Switch on 2017-02-13.*/
public class TextBuilder extends Builder {// 文本保存对象private StringBuilder stringBuilder = new StringBuilder();@Overridepublic void makeTitle(String title) {stringBuilder.append("==============================\n");stringBuilder.append("[" + title + "]\n");stringBuilder.append("\n");}@Overridepublic void makeString(String str) {stringBuilder.append("》" + str + "\n");stringBuilder.append("\n");}@Overridepublic void makeItems(List<String> items) {for (String item : items) {stringBuilder.append("》》》" + item + "\n");}stringBuilder.append("\n");}@Overridepublic void close() {stringBuilder.append("==============================\n");}/*** 获取文本** @return 文本字符串*/public String getResult() {return stringBuilder.toString();}
}

HTMLBuilder类

package com.pc.builder.example;import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;/*** 超文本Builder* Created by Switch on 2017-02-13.*/
public class HTMLBuilder extends Builder {// 文件名private String filename;// 编写文档的PrintWriter对象private PrintWriter writer;@Overridepublic void makeTitle(String title) {// 将标题作为文件名this.filename = title + ".html";try {// 创建PrintWriter对象writer = new PrintWriter(new FileWriter("E:\\" + filename));} catch (IOException e) {e.printStackTrace();}writer.println("<html><head><title>" + title + "</title>");writer.println("<meta charset='UTF-8'></meta>");writer.println("</head><body>");// 输出标题writer.println("<h1>" + title + "</h1>");}@Overridepublic void makeString(String str) {writer.println("<p>" + str + "</p>");}@Overridepublic void makeItems(List<String> items) {writer.println("<ul>");for (String item : items) {writer.println("<li>" + item + "</li>");}writer.println("</ul>");}@Overridepublic void close() {writer.println("</body></html>");writer.close();}/*** 获取文件名** @return 文件名*/public String getResult() {return this.filename;}
}

测试类

package com.pc.builder.example.test;import com.pc.builder.example.Director;
import com.pc.builder.example.HTMLBuilder;
import com.pc.builder.example.TextBuilder;
import org.junit.Test;/*** 建造者测试类* Created by Switch on 2017-02-13.*/
public class BuilderTest {}

测试方法

    @Testpublic void testTextBuilder() {// 创建文本Builder对象TextBuilder builder = new TextBuilder();// 创建Director类Director director = new Director(builder);// 创建文本director.construct();// 获取结果String result = builder.getResult();System.out.println(result);}
运行结果
==============================
[Greeting]》Switch》》》早上好
》》》中午好
》》》晚上好》Kity》》》晚上好
》》》中午好
》》》早上好==============================

测试方法

    @Testpublic void testHTMLBuilder() {// 创建超文本Builder对象HTMLBuilder builder = new HTMLBuilder();// 创建Director类Director director = new Director(builder);// 创建文本director.construct();// 获取结果String result = builder.getResult();System.out.println(result);}
运行结果
控制台输出
Greeting.html
E盘下Greeting.html的内容
<html><head><title>Greeting</title>
<meta charset='UTF-8'></meta>
</head><body>
<h1>Greeting</h1>
<p>Switch</p>
<ul>
<li>早上好</li>
<li>中午好</li>
<li>晚上好</li>
</ul>
<p>Kity</p>
<ul>
<li>晚上好</li>
<li>中午好</li>
<li>早上好</li>
</ul>
</body></html>
浏览器中运行结果

建造者模式中的角色

Builder(建造者)

Builder角色负责定义用于生成实例的接口(API)。Builder角色中准备了用于生成实例的方法。
在案例中,由Builder类扮演此角色。

ConcreteBuilder(具体的建造者)

ConcreteBuilder角色是负责实现Builder角色的接口的类(API)。这里定义了在生成实例时实际被调用的方法。此外,在ConcreteBuilder角色中还定义了获取最终生成结果的方法。在案例中,由TextBuilder类和HTMLBuilder类扮演此角色。

Director(监工)

Director角色负责使用Builder角色的接口(API) 来生成实例。它并不依赖于ConcreteBuilder角色。为了确保不论ConcreteBuilder角色是如何被定义的,Director角色都能正常工作,它只调用在Builder角色中被定义的方法。在案例中,由Director类扮演此角色。

Client(使用者)

该角色使用了Builder模式(在GoF的书中,Builder模式并不包含Client角色)。在案例中,由测试类扮演此角色。

类图

时序图

GitHub:DesignPatternStudy

——————参考《图解设计模式》

设计模式学习笔记——建造者(Builder)模式相关推荐

  1. 设计模式学习笔记——装饰(Decorator)模式

    设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...

  2. 设计模式学习笔记——解释器(Interpreter)模式

    设计模式学习笔记--解释器(Interpreter)模式 @(设计模式)[设计模式, 解释器模式, Interpreter] 设计模式学习笔记解释器Interpreter模式 基本介绍 解释器案例 类 ...

  3. 设计模式学习笔记——命令(Command)模式

    设计模式学习笔记--命令(Command)模式 @(设计模式)[设计模式, 命令模式, command] 设计模式学习笔记命令Command模式 基本介绍 命令案例 类图 实现代码 Command接口 ...

  4. 设计模式学习笔记——代理(Proxy)模式

    设计模式学习笔记--代理(Proxy)模式 @(设计模式)[设计模式, 代理模式, proxy] 设计模式学习笔记代理Proxy模式 基本介绍 代理案例 类图 实现代码 Printable接口 Pri ...

  5. 设计模式学习笔记——状态(State)模式框架

    设计模式学习笔记--状态(State)模式框架 @(设计模式)[设计模式, 状态模式, State] 设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 Day ...

  6. 设计模式学习笔记——备忘录(Memento)模式

    设计模式学习笔记--备忘录(Memento)模式 @(设计模式)[设计模式, 备忘录模式, memento] 设计模式学习笔记备忘录Memento模式 基本介绍 备忘录案例 类图 实现代码 Memen ...

  7. 设计模式学习笔记——观察者(Observer)模式

    设计模式学习笔记--观察者(Observer)模式 @(设计模式)[设计模式, 观察者模式, Observer] 设计模式学习笔记观察者Observer模式 基本介绍 观察者案例 类图 实现代码 Ob ...

  8. 设计模式学习笔记——外观(Facade)模式

    设计模式学习笔记--外观(Facade)模式 @(设计模式)[设计模式, 外观模式, facade] 设计模式学习笔记外观Facade模式 基本介绍 外观案例 类图 实现代码 Database类 ma ...

  9. 设计模式学习笔记——访问者(Visitor)模式

    设计模式学习笔记--访问者(Visitor)模式 @(设计模式)[设计模式, 访问者模式, visitor] 设计模式学习笔记访问者Visitor模式 基本介绍 访问者案例 类图 实现代码 Visit ...

最新文章

  1. 10种Git技巧,让你省时省力又省心!
  2. HDU_oj_2021 发工资喽
  3. 提高jQuery执行效率
  4. 【控制】如何入门自动控制理论
  5. 技术如何秒懂你?阿里百万级QPS资源调度系统揭秘
  6. 【洛谷 1969】积木大赛
  7. 大数据服务社会的一个有益实践
  8. 图解 IDEA 中 springboot 项目 MyBatis Generator 逆向生成实体类及 mapper 配置文件
  9. 低价iPhone 12彻底没戏了?苹果严控渠道:给拼多多等电商供货罚款40万元/台
  10. python安装opencv whl_Python 3.x 安装opencv+opencv_contrib的操作方法
  11. java aqs原理_Java并发之AQS详解
  12. 【MapGIS精品教程】006:MapGIS根据经纬度计算各比例尺图幅编号
  13. 他是JavaScript之父,搞砸Firefox!推出下一代浏览器,使用就给钱!
  14. lolfps高但画面不流畅_高配电脑玩英雄联盟FPS异常的解决方法
  15. 172Echarts - 象形柱图(Dotted bar)
  16. SpringMVC 406
  17. java 自动识别邮箱服务器类型_Java实现通过smtp服务器验证邮箱的真实有效性
  18. mt6761平台 源码内置APK报错“/lib/xxxx.so“ not found
  19. 20220530-动态规划算法及Needleman-Wunsch算法
  20. scipy5.01:积分应用:椭球体积的数值积分计算

热门文章

  1. Docker上搭建Mysql8.0服务器
  2. 解决浏览器跨域加载本地文件报错 Access to script at ‘xxx‘ from origin ‘null‘ has been blocked by CORS policy
  3. 20以内的素数编码C语言,用C语言 输出100以内的素数,
  4. leetcode| 94. 二叉树的中序遍历
  5. vscode常用快捷键大全
  6. Python中的@property Decorator:其用例,优点和语法
  7. falcon框架_如何使用Falcon构建RESTful API
  8. 利兹大学计算机硕士专业排名,2020年利兹大学数学与计算机科学硕士专业硕士申请条件-学费-世界排名...
  9. java jnlp 靠谱吗_获取当前的JNLP信息
  10. angular.js入门基础(一)