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. mysql安装可能遇到的错误和安装过程

    http://jingyan.baidu.com/article/8ebacdf02e392a49f65cd52d.html

  2. 深入了解String,StringBuffer和StringBuilder三个类的异同

    Java提供了三个类,用于处理字符串,分别是String.StringBuffer和StringBuilder.其中StringBuilder是jdk1.5才引入的. 这三个类有什么区别呢?他们的使用 ...

  3. C++之路 #1

    一.C++介绍C++是C语言的继承,它可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计.C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计 ...

  4. Django之使用redis缓存session,历史浏览记录,首页数据实现性能优化

    Redis缓存session 配置Django缓存数据到redis中 # diango的缓存配置 CACHES = { "default": { "BACKEND&quo ...

  5. redis服务打不开--解决办法

    D:\>redis-server[11896] 04 Dec 19:20:05.122 # Warning: no config file specified, using the defaul ...

  6. jQuery查找节点(选择器)

    jQuery通过选择器来完成节点的查找: 1.基本选择器: ①通用/所有的选择器:$("*") //使用*号来表示. ②:标签选择器:$("标签名(div)") ...

  7. js数组和表的基本操作

    数组 var v = [3, 6, "hello"]; console.log(v.length); 数组的遍历1 function ss() { for (var i = 0; ...

  8. Docker 网易镜像仓库使用

    Docker 网易镜像仓库使用: 网易账号注册: https://id.163yun.com/register?h=fc&referrer=https://console.163yun.com ...

  9. Cocos Creator实现左右跳游戏,提供完整游戏代码工程

    ​1. 玩法说明 游戏开始后,点击屏幕左右两侧,机器人朝左上方或右上方跳一步,如果下一步有石块,成功得1分,否则游戏结束. 2. 模块介绍 游戏场景分为2个:主页场景(home).游戏场景(game) ...

  10. synchronized块中的wait()、nofity()、nofityAll()方法

    前言 在Java并发编程实战,会经常遇到多个线程访问同一个资源的情况,这个时候就需要维护数据的一致性,否则会出现各种数据错误,其中一种同步方式就是利用Synchronized关键字执行锁机制,锁机制是 ...