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. 如何快速转载CSDN中的博客

    看到一篇<如何快速转载CSDN中的博客>,介绍通过检查元素→复制html来实现快速转载博客的方法.不过,不知道是我没有领会其精神还是其他原因,测试结果为失败.

  2. windows下虚拟环境virtualenv的简单操作

    使用豆瓣源安装(推荐) [推荐] python3.X安装和pip安装方法 pip install -i https://pypi.douban.com/simple XXX 1.安装virtualen ...

  3. electron教程(三): 使用ffi-napi引入C++的dll

    我的electron教程系列 electron教程(一): electron的安装和项目的创建 electron教程(二): http服务器, ws服务器, 进程管理 electron教程(三): 使 ...

  4. Shell之StdI/O和Pipe

    目录 Shell之StdI/O和Pipe 参考 StdI/O重定向 Pipe 常用组合 Shell之StdI/O和Pipe

  5. linux系统下使用xampp 丢失mysql root密码 只能远程访问,本地无法连接数据库

    如果在ubuntu 下面 使用xampp这个集成开发环境,却忘记mysql密码. 当出现只能远程访问的,本地无法访问,通常是host改成% 远程访问,本地访问到一个是空壳.这是权限的问题 需要修hos ...

  6. css 精灵图的使用

    精灵图的使用 1.给一个容器定义一个大小(宽高) 2.引入背景图 3.定位到自己你想要的图片位置 例如:  background-position: 0 0;  background-position ...

  7. 【柠檬班】jmeter 不写代码,秒秒钟提取动态列表最后一个值

    在用jmeter做接口测试时,我们经常会遇到,一个接口返回一个json串,在这个json串中,某个节点的值是一个列表,而且这个列表的长度是动态变化的.如:   获取用户列表,用户信息是个列表,类似的接 ...

  8. [LeetCode] 822. Card Flipping Game

    Description On a table are N cards, with a positive integer printed on the front and back of each ca ...

  9. Java 学习笔记之 线程interrupt方法

    线程interrupt方法: interrupt方法是用来停止线程的,但是他的使用效果并不像for+break那样,马上就停止循环. 调用interrupt()其实仅仅是在当前线程中打了一个停止标记, ...

  10. CSS动画,2D和3D模块

    CSS3提供了丰富的动画类属性,使我们可以不通过flash甚至JavaScript,就能实现很多动态的效果.它们主要分为三大类:transform(变换),transition(过渡),animati ...