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模式的更多相关文章

  1. 设计模式:Builder模式

    设计模式:Builder模式 一.前言    今天我们讨论一下Builder建造者模式,这个Builder,其实和模板模式非常的像,但是也有区别,那就是在模板模式中父类对子类中的实现进行操作,在父类之 ...

  2. Java设计模式之builder模式

    Java设计模式之builder模式 今天学mybatis的时候,知道了SQLSessionFactory使用的是builder模式来生成的.再次整理一下什么是builder模式以及应用场景. 1. ...

  3. Java设计模式-建造者(Builder)模式

    目录 由来 使用 1. 定义抽象 Builder 2. 定义具体 Builder类 3. 定义具体 Director类 4. 测试 定义 文字定义 结构图 优点 举例 @ 最近在看Mybatis的源码 ...

  4. c++设计模式系列----builder模式

    看了好几处关于builder模式的书和博客,总感觉不是很清楚,感觉不少书上的说的也不是很准确.最后还是看回圣经<设计模式>.看了好久终于感觉明白了一点了. 意图: builder模式提出的 ...

  5. [转]C++设计模式:Builder模式

    Builder模式要解决的问题是,当我们要创建很复杂的对象时,有时候需要将复杂对象的创建过程和这个对象的表示分离开来.由于在每一步的构造过程中可以映入不同参数,所以步骤相同但是最后的对象却不一样.也就 ...

  6. 设计模式之Builder模式

    一.感性认识 二.Builder模式 1.定义 一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.即构建过程相同,但是子部件却不相同. 2.结构说明 Builder: 创建者接口 ...

  7. Java设计模式--Java Builder模式

    1.Java Builder模式主要是用一个内部类去实例化一个对象,避免一个类出现过多构造函数,而且构造函数如果出现默认参数的话,很容易出错. public Person(String name) P ...

  8. 《Android源码设计模式》--Builder模式

    No1: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 No2: 在Android源码中,最常用到的Builder模式就是AlertDialog.Builder No3: ...

  9. 设计模式--建造者(Builder)模式

    将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示                                                         --<设计模 ...

  10. php设计模式七 ---组合模式

    1.介绍 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结 ...

随机推荐

  1. java架构之路-(分布式)初识zookeeper安装与参数详解

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...

  2. 学习VBA

    学习VBA VBA 就是 (Visual basic for Application) 用的比较多的是在Excel中处理数据,可以方便快捷地使用编程方式来对数据进行操作. VBA 数据类型 Integ ...

  3. Nginx的基本安装配置

    Centos7安装nginx 升级nginx 升级可能遇到问题(我没有遇到, 参考的另一篇文章描述的) 检查nginx版本, 确认安装成功 nginx配置文件 虚拟主机配置 配置文件中可以用的全局变量 ...

  4. 【Java】支付宝获取人脸采集认证的图片base64格式

    人脸识别结果查询接口zoloz.identification.user.web.query返回的imgStr图片字符串并不是标准的base64格式,解析不出图片. 由于标准的Base64并不适合直接放 ...

  5. .Net Core删除ClientApp目录,重新生成报错解决办法

    因为在老的项目上做修改,需要删除单独的spa目录,就把ClientApp删掉了.但是重新生成报错,在VS2017界面上也没找到在什么地方配置.最后发现在csproj上里面可以去掉spa的配置 < ...

  6. SpringBoot系列:Spring Boot使用模板引擎Thymeleaf

    一.Java模板引擎 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档. 在jav ...

  7. Linux修改屏幕分辨率至2K

    使用命令:cvt,与 xrandr 使用cvt命令查看分辨率配置: Modeline后边分别是 modeName 以及 详细的配置 linklee@linklee-270E5G-270E5U:~$ c ...

  8. docker镜像命令使用

    创建docker容器时使用的docker镜像如果在本地中不存在,docker就会自动从docker镜像仓库中下载,默认的docker镜像仓库是Docker Hub公共镜像源 使用docker sear ...

  9. Spring Security 学习记录

    一.核心拦截器详细说明 1.WebAsyncManagerIntegrationFilter 根据请求封装获取WebAsyncManager 从WebAsyncManager获取/注册Security ...

  10. B-概率论-贝叶斯决策

    目录 贝叶斯决策 一.贝叶斯决策理论 二.贝叶斯公式 2.1 从条件概率公式推导贝叶斯公式 2.2 从全概率公式推导贝叶斯公式 三.贝叶斯公式应用 更新.更全的<机器学习>的更新网站,更有 ...