设计模式学习笔记——建造者(Builder)模式
设计模式学习笔记——建造者(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)模式相关推荐
- 设计模式学习笔记——装饰(Decorator)模式
设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...
- 设计模式学习笔记——解释器(Interpreter)模式
设计模式学习笔记--解释器(Interpreter)模式 @(设计模式)[设计模式, 解释器模式, Interpreter] 设计模式学习笔记解释器Interpreter模式 基本介绍 解释器案例 类 ...
- 设计模式学习笔记——命令(Command)模式
设计模式学习笔记--命令(Command)模式 @(设计模式)[设计模式, 命令模式, command] 设计模式学习笔记命令Command模式 基本介绍 命令案例 类图 实现代码 Command接口 ...
- 设计模式学习笔记——代理(Proxy)模式
设计模式学习笔记--代理(Proxy)模式 @(设计模式)[设计模式, 代理模式, proxy] 设计模式学习笔记代理Proxy模式 基本介绍 代理案例 类图 实现代码 Printable接口 Pri ...
- 设计模式学习笔记——状态(State)模式框架
设计模式学习笔记--状态(State)模式框架 @(设计模式)[设计模式, 状态模式, State] 设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 Day ...
- 设计模式学习笔记——备忘录(Memento)模式
设计模式学习笔记--备忘录(Memento)模式 @(设计模式)[设计模式, 备忘录模式, memento] 设计模式学习笔记备忘录Memento模式 基本介绍 备忘录案例 类图 实现代码 Memen ...
- 设计模式学习笔记——观察者(Observer)模式
设计模式学习笔记--观察者(Observer)模式 @(设计模式)[设计模式, 观察者模式, Observer] 设计模式学习笔记观察者Observer模式 基本介绍 观察者案例 类图 实现代码 Ob ...
- 设计模式学习笔记——外观(Facade)模式
设计模式学习笔记--外观(Facade)模式 @(设计模式)[设计模式, 外观模式, facade] 设计模式学习笔记外观Facade模式 基本介绍 外观案例 类图 实现代码 Database类 ma ...
- 设计模式学习笔记——访问者(Visitor)模式
设计模式学习笔记--访问者(Visitor)模式 @(设计模式)[设计模式, 访问者模式, visitor] 设计模式学习笔记访问者Visitor模式 基本介绍 访问者案例 类图 实现代码 Visit ...
最新文章
- 10种Git技巧,让你省时省力又省心!
- HDU_oj_2021 发工资喽
- 提高jQuery执行效率
- 【控制】如何入门自动控制理论
- 技术如何秒懂你?阿里百万级QPS资源调度系统揭秘
- 【洛谷 1969】积木大赛
- 大数据服务社会的一个有益实践
- 图解 IDEA 中 springboot 项目 MyBatis Generator 逆向生成实体类及 mapper 配置文件
- 低价iPhone 12彻底没戏了?苹果严控渠道:给拼多多等电商供货罚款40万元/台
- python安装opencv whl_Python 3.x 安装opencv+opencv_contrib的操作方法
- java aqs原理_Java并发之AQS详解
- 【MapGIS精品教程】006:MapGIS根据经纬度计算各比例尺图幅编号
- 他是JavaScript之父,搞砸Firefox!推出下一代浏览器,使用就给钱!
- lolfps高但画面不流畅_高配电脑玩英雄联盟FPS异常的解决方法
- 172Echarts - 象形柱图(Dotted bar)
- SpringMVC 406
- java 自动识别邮箱服务器类型_Java实现通过smtp服务器验证邮箱的真实有效性
- mt6761平台 源码内置APK报错“/lib/xxxx.so“ not found
- 20220530-动态规划算法及Needleman-Wunsch算法
- scipy5.01:积分应用:椭球体积的数值积分计算
热门文章
- Docker上搭建Mysql8.0服务器
- 解决浏览器跨域加载本地文件报错 Access to script at ‘xxx‘ from origin ‘null‘ has been blocked by CORS policy
- 20以内的素数编码C语言,用C语言 输出100以内的素数,
- leetcode| 94. 二叉树的中序遍历
- vscode常用快捷键大全
- Python中的@property Decorator:其用例,优点和语法
- falcon框架_如何使用Falcon构建RESTful API
- 利兹大学计算机硕士专业排名,2020年利兹大学数学与计算机科学硕士专业硕士申请条件-学费-世界排名...
- java jnlp 靠谱吗_获取当前的JNLP信息
- angular.js入门基础(一)