Builder模式又叫建造模式,是用于组装具有复杂结构的实例的模式。

示例程序是编写一个文档,并且写入到文件中,该文档具有以下结构,含有标题,字符串,一些条目。

  • Builder抽象类,为建造模式的核心
package site.wangxin520.gof.builder;

/**
* 建造者模式的核心——建造者
* 负责定义用于生成实例的API接口
* @author wangXgnaw
* 在本类中,定义了四个方法,分别是标题,字符串和条目,最后的close()方法则用于生成文件以及关闭相应的流
*/
public abstract class Builder { /**
* 抽象方法,传入字符串标题,用于生成文件的字符串
* @param title
*/
public abstract void makeTitle(String title); /**
* 抽象方法,传入字符串
* @param string
*/
public abstract void makeString(String string); /**
* 抽象方法,用于传入一个字符串数组,生成文件中对应的条目
* @param items
*/
public abstract void makeItems(String[] items); /**
* 抽象方法,关闭相应的流
*/
public abstract void close(); }
  • Director 监工类,调用builder的方法
package site.wangxin520.gof.builder;

/**
* 管理者,监工
* 负责使用builder角色的接口来生成实例,它并不依赖于具体实现类,而是面对抽象类/父类,或者接口进行操作
* @author wangXgnaw
* 在本类汇总有一个Builder的属性。
* 采用的是多态的方法,父类接口指向子类对象
*/
public class Director { private Builder builder; /**
* 构造器传入Builder属性的具体实现
* @param builder
*/
public Director(Builder builder){
this.builder=builder;
} /**
* 生成文档的方法
*/
public void construct(){ builder.makeTitle("标题:大家好");
builder.makeString("从早上到下午");
builder.makeItems(new String[]{
"早安",
"午安",
});
builder.makeString("晚上");
builder.makeItems(new String[]{
"晚安",
"拜拜",
});
builder.close(); } }
  • HtmlBuilder 继承了Builder类,实现了相应的方法
package site.wangxin520.gof.builder;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException; /**
* 生成HTML文件的建造模式,对Builder抽象类的具体实现
* @author wangXgnaw
*
*/
public class HtmlBuilder extends Builder{ private StringBuilder sb=new StringBuilder(); @Override
public void makeTitle(String title) {
sb.append("<html>").append("<head><title>").append(title).append("</title></head><body>");
} @Override
public void makeString(String string) {
sb.append("<p>").append(string).append("</p>");
} @Override
public void makeItems(String[] items) {
sb.append("<ul>");
for (String string : items) {
sb.append("<li>").append(string).append("</li>");
}
sb.append("</ul>");
} @Override
public void close() {
sb.append("</body></html>");
FileWriter fw=null;
try {
fw=new FileWriter(new File("E:/TextBuilder.html"));
fw.write(sb.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fw!=null){
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} }
  • TextBuilder同上
package site.wangxin520.gof.builder;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException; /**
* 生成txt文件的建造模式,对Builder抽象类的具体实现
*
* @author wangXgnaw
*
*/
public class TextBuilder extends Builder { private StringBuilder sb = new StringBuilder(); @Override
public void makeTitle(String title) {
sb.append("========================================").append("\r\n");
sb.append("【" + title + "】").append("\r\n");
sb.append("========================================").append("\r\n").append("\r\n");
} @Override
public void makeString(String string) {
sb.append("【.】" + string).append("\r\n").append("\r\n");
} @Override
public void makeItems(String[] items) {
for (String string : items) {
sb.append("\t" + string).append("\r\n");
}
sb.append("\r\n");
} @Override
public void close() {
sb.append("========================================");
FileWriter fw = null;
try {
fw = new FileWriter(new File("E:/TextBuilder.txt"));
fw.write(sb.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} }
  • Main,测试类
package site.wangxin520.gof.builder;

/**
* 建造者模式的测试类
* @author wangXgnaw
*
*/
public class Main { public static void main(String[] args) { //先构建一个Builder,采用的是TextBuilder的实现类
Builder b1=new TextBuilder();
//将Builder实例传入到Director中
Director director1=new Director(b1);
//调用构造方法,生成文档
director1.construct(); //与上同
Builder b2=new HtmlBuilder();
Director director2=new Director(b2);
director2.construct(); } }
  • 测试结果:

没有报错,并且成功的在E盘中写入俩文件

TextBuilder.txt

TextBuilder.html(这里忘记改名字了)

设计模式之——Builder建造模式的更多相关文章

  1. 设计模式(5)--Builder(建造模式)--创建型

    1.模式定义: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品 ...

  2. 《JAVA设计模式》之建造模式(Builder)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal representation ...

  3. 设计模式之Builder建造者模式 代码初见

    public class EmployeeBuilder { private int id = 1; private string firstname = "first"; pri ...

  4. 设计模式学习之建造者模式(Builder,创建型模式)(6)

    假如我们需要建造一个房子,并且我们也不知道如何去建造房子,所以就去找别人帮我们造房子 第一步: 新建一个房子类House,里面有房子该有的属性,我们去找房子建造者接口HouseBuilder,我们要建 ...

  5. 设计模式(二): BUILDER生成器模式 -- 创建型模式

    1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 ...

  6. linkin大话设计模式--建造模式

    linkin大话设计模式--建造模式 建造模式是对象的创建模式,可以讲一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 建造模式的结构: 抽象建造者 ...

  7. java设计模式4--建造者模式(Builder)

    本文地址:http://www.cnblogs.com/archimedes/p/java-builder-pattern.html,转载请注明源地址. 建造者模式 将一个复杂对象的构建与它的表示分离 ...

  8. 设计模式之建造者(Builder)模式

    设计模式之建造者(Builder)模式 存在一些情况,比如,一些对象会有一些重要的属性,在这些属性没有恰当的值之前,对象不能作为一个完整的产品使用(如一个电子邮件最起码得有收件人地址):还有一些些情况 ...

  9. 一天一个设计模式——Builder建造者模式

    一.模式说明 在现实世界中,当我们要构造一个大型工程时(建一个大楼),通常的做法是先建造工程的每个独立部分,然后再逐步构造完成(先打地基,再搭框架,最后逐层累造).在程序设计领域,构造一个复杂的类时( ...

随机推荐

  1. UITableView__cell 距tableview顶端有间距

    UITableView__cell 距tableview顶端有间距     如何去掉这个间距呢?解决方法如下: //top 为cell距顶端的间距 (一般为负值) self.formTable.con ...

  2. background-origin:规定 background-position 属性相对于什么位置来定位

    background-origin:border-box;此时设置background-size:contain; 根据容器的边框定位 例如:容器的盒模型如下:设置了padding:20px;bord ...

  3. 安装expect命令 两种方式

    yum安装 yum -y install expect 手动安装 expect以及tcl版本 #!/bin/bash oldpath=`pwd` tar -zxf tcl8.4.20-src.tar. ...

  4. qt setData()和data()

    简述 在GUI开发中,往往需要在界面中存储一些有用的数据,这些数据可以来自配置文件.注册表.数据库.或者是Server. 无论来自哪里,这些数据对于用户来说都是至关重要的,它们在交互过程中大部分都会被 ...

  5. wpa wp2 psk的配置方式

    For WPA-PSK ctrl_interface=/var/run/wpa_supplicant ctrl_interface_group=0 eapol_version=1 fast_reaut ...

  6. 关于HTTP的长连接和短连接

    1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议. IP协议主要解决网络路由和寻址 ...

  7. EasyUI 另一种form提交方式

    (function ($) { window.XW = {}; //全局系统对象 //异步请求统一调用方法 XW.ajax = function (options, param, callback) ...

  8. Javascript 你不知道的事

    NaN表示一个不能产生正常结果的运算结果.它不等于任何值,包括它自己.可以用isNaN(number)来检测. 同Java中的字符串一样,JS中的字符串是不可变的.也就是说一旦字符串被创建,就无法改变 ...

  9. Spring Framework 官方文档学习(二)之IoC容器与bean lifecycle

    到目前为止,已经看了一百页.再次感慨下,如果想使用Spring,那可以看视频或者找例子,但如果想深入理解Spring,最好还是看官方文档. 原计划是把一些基本接口的功能.层次以及彼此的关系罗列一下.同 ...

  10. 【BZOJ】1666: [Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏(刷水严重)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1666 这种我就不说了.. #include <cstdio> #include < ...