设计模式(七)Builder模式
Builder模式,从这个名字我们可以看出来,这种设计模式就是用于组装具有复杂结构的实例的。
下面还是以一个实例程序来解释这种设计模式,先看实例程序的类图。

这里为了调试方便,只实现其中一个功能TextBuilder,剩下的HTMLBuilder可自行编写。
然后是实例程序代码。
package BigJunOba.bjtu.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(); //完成文档
}
Builder类是一个抽象类,它并没有进行任何实际的处理,仅仅声明了编写文档所要用到的抽象方法。
package BigJunOba.bjtu.Builder;
/**
* @author BigJunOba
* Director类使用Builder类中声明的方法来编写文档
*/
public class Director { private Builder builder; public Director(Builder builder) {
this.builder = builder;
} public void construct() {
builder.makeTitle("我是一个标题");
builder.makeString("一.下面我要讲第一个问题");
builder.makeItems(new String[] {
"1.廉",
"2.宝",
"3.宝",
});
builder.makeString("二.下面我还要讲第二个问题");
builder.makeItems(new String[] {
"4.大",
"5.帅",
"6.逼",
});
builder.close();
} }
Director类。这里需要注意的是,Director构造器的参数是Builder类型的,但我们知道,Builder类是抽象类,是无法实例化的,所以在这里实际上传递给Director类的是Builder类的子类。然后construct方法就是编写文档的方法,调用这个方法后就会编写文档。
package BigJunOba.bjtu.Builder;
public class TextBuilder extends Builder {
//用来将文档内容保存在buffer字段中
private StringBuffer buffer = new StringBuffer();
@Override
public void makeTitle(String title) {
buffer.append("======================\n");
buffer.append("\n");
buffer.append("[" + title + "]");
buffer.append("\n");
}
@Override
public void makeString(String str) {
buffer.append('*' + str + "\n");
buffer.append("\n");
}
@Override
public void makeItems(String[] items) {
for (int i = 0; i < items.length; i++) {
buffer.append(" ." + items[i] + "\n");
}
buffer.append("\n");
}
@Override
public void close() {
buffer.append("======================\n");
}
public String getResult() {
return buffer.toString(); //将StringBuffer变换为String
}
}
TextBuilder类是Builder类的子类,实现了使用纯文本编写文档并以string返回结果。
package BigJunOba.bjtu.Builder;
public class Main {
public static void main(String[] args) {
TextBuilder textBuilder = new TextBuilder();
Director director = new Director(textBuilder);
director.construct();
String result = textBuilder.getResult();
System.out.println(result);
}
}
Main类作为测试类,首先创建了一个TextBuilder的对象,然后把Builder类的子类,即TextBuilder的对象的实例传递给Director类,然后打印输出结果。
====================== [我是一个标题]
*一.下面我要讲第一个问题 .1.廉
.2.宝
.3.宝 *二.下面我还要讲第二个问题 .4.大
.5.帅
.6.逼 ======================
这是输出。
Builder模式的类图和时序图如下。
解释每一个部分:
Builder:定义用于生成实例的接口。
Director:使用Builder中定义的接口,
ConcreteBuilder:用来具体实现Builder接口,在生成实例时实际被调用。这里要注意的是,可以有多个ConcreteBuilder来实现不同的功能。如示例中没有实现的HTMLBuilder类。
Client:使用了Builder模式,不属于模式的一部分,示例中的Main类就是使用Builder模式从而得出结果。


设计模式(七)Builder模式的更多相关文章
- 设计模式:Builder模式
设计模式:Builder模式 一.前言 今天我们讨论一下Builder建造者模式,这个Builder,其实和模板模式非常的像,但是也有区别,那就是在模板模式中父类对子类中的实现进行操作,在父类之 ...
- Java设计模式之builder模式
Java设计模式之builder模式 今天学mybatis的时候,知道了SQLSessionFactory使用的是builder模式来生成的.再次整理一下什么是builder模式以及应用场景. 1. ...
- Java设计模式-建造者(Builder)模式
目录 由来 使用 1. 定义抽象 Builder 2. 定义具体 Builder类 3. 定义具体 Director类 4. 测试 定义 文字定义 结构图 优点 举例 @ 最近在看Mybatis的源码 ...
- c++设计模式系列----builder模式
看了好几处关于builder模式的书和博客,总感觉不是很清楚,感觉不少书上的说的也不是很准确.最后还是看回圣经<设计模式>.看了好久终于感觉明白了一点了. 意图: builder模式提出的 ...
- [转]C++设计模式:Builder模式
Builder模式要解决的问题是,当我们要创建很复杂的对象时,有时候需要将复杂对象的创建过程和这个对象的表示分离开来.由于在每一步的构造过程中可以映入不同参数,所以步骤相同但是最后的对象却不一样.也就 ...
- 设计模式之Builder模式
一.感性认识 二.Builder模式 1.定义 一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.即构建过程相同,但是子部件却不相同. 2.结构说明 Builder: 创建者接口 ...
- Java设计模式--Java Builder模式
1.Java Builder模式主要是用一个内部类去实例化一个对象,避免一个类出现过多构造函数,而且构造函数如果出现默认参数的话,很容易出错. public Person(String name) P ...
- 《Android源码设计模式》--Builder模式
No1: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 No2: 在Android源码中,最常用到的Builder模式就是AlertDialog.Builder No3: ...
- 设计模式--建造者(Builder)模式
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示 --<设计模 ...
- php设计模式七 ---组合模式
1.介绍 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结 ...
随机推荐
- java架构之路-(分布式)初识zookeeper安装与参数详解
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...
- 学习VBA
学习VBA VBA 就是 (Visual basic for Application) 用的比较多的是在Excel中处理数据,可以方便快捷地使用编程方式来对数据进行操作. VBA 数据类型 Integ ...
- Nginx的基本安装配置
Centos7安装nginx 升级nginx 升级可能遇到问题(我没有遇到, 参考的另一篇文章描述的) 检查nginx版本, 确认安装成功 nginx配置文件 虚拟主机配置 配置文件中可以用的全局变量 ...
- 【Java】支付宝获取人脸采集认证的图片base64格式
人脸识别结果查询接口zoloz.identification.user.web.query返回的imgStr图片字符串并不是标准的base64格式,解析不出图片. 由于标准的Base64并不适合直接放 ...
- .Net Core删除ClientApp目录,重新生成报错解决办法
因为在老的项目上做修改,需要删除单独的spa目录,就把ClientApp删掉了.但是重新生成报错,在VS2017界面上也没找到在什么地方配置.最后发现在csproj上里面可以去掉spa的配置 < ...
- SpringBoot系列:Spring Boot使用模板引擎Thymeleaf
一.Java模板引擎 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档. 在jav ...
- Linux修改屏幕分辨率至2K
使用命令:cvt,与 xrandr 使用cvt命令查看分辨率配置: Modeline后边分别是 modeName 以及 详细的配置 linklee@linklee-270E5G-270E5U:~$ c ...
- docker镜像命令使用
创建docker容器时使用的docker镜像如果在本地中不存在,docker就会自动从docker镜像仓库中下载,默认的docker镜像仓库是Docker Hub公共镜像源 使用docker sear ...
- Spring Security 学习记录
一.核心拦截器详细说明 1.WebAsyncManagerIntegrationFilter 根据请求封装获取WebAsyncManager 从WebAsyncManager获取/注册Security ...
- B-概率论-贝叶斯决策
目录 贝叶斯决策 一.贝叶斯决策理论 二.贝叶斯公式 2.1 从条件概率公式推导贝叶斯公式 2.2 从全概率公式推导贝叶斯公式 三.贝叶斯公式应用 更新.更全的<机器学习>的更新网站,更有 ...