概述

建造者模式(Builder Pattern),是创造性模式之一,Builder 模式的目的则是为了将对象的构建与展示分离。Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程。

本质

分离了对象子组件的单独构造(由Builder来单独负责)和装配(由Director来负责)从而构造出复杂的对象,从而实现了构造和装配的解耦,不同构造器相同装备装配也可以做出不同的对象;相同构造器不同装配顺序也可以做好受不同的对象,也就是实现了构建算法和装配算法的解耦,实现了更好的复用。

UML类图

角色介绍

名字 说明
Builder 定义了产品的接口
Director 定义实际构造产品的类
TextBuilder Builder接口的实现类(此处的产品指的是纯文本类)
HTMLBuilder Builder接口的实现类(此处的产品指的是HTML文本类)
Client 测试程序行为的类

Builder模式简单实现

Builer接口

    public interface Builder {
public abstract void makeTitle(String title);
public abstract void makeString(String str);
public abstract void makeItems(String[] items);
public abstract void close();
}

Director构造类

    public class Director {
private Builder builder;
public Director(Builder builder){
this.builder=builder;
}
/*
* 具体进行文档创建的方法,包含创建文档的若干步骤
*/
public void construct(){
builder.makeTitle("标题");
builder.makeString("我是正文");
builder.makeItems(new String[]{
"晚上好","早上好"
});
builder.close();
}
}

TextBuilderiy纯文本实现类

    public class TextBulider implements Builder{
private StringBuffer buffer=new StringBuffer();
@Override
public void makeTitle(String title) {
buffer.append("*===========================*");
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();
}
}

HTMLBuilder网页文本实现类

    public class HTMLBuilder implements Builder{
private StringBuffer buffer=new StringBuffer();
@Override
public void makeTitle(String title) {
buffer.append("<html><head><title>"+title+"</title>");
} @Override
public void makeString(String str) {
buffer.append("<p>"+str+"</p>");
} @Override
public void makeItems(String[] items) {
buffer.append("<ul>");
for(int i=0;i<items.length;i++){
buffer.append("<li>"+items[i]+"</li>");
}
buffer.append("</ul>");
} @Override
public void close() {
buffer.append("</body></html>");
}
public String getResult(){
return buffer.toString();
}
}

Client测试类

 public class Client {
public static void main(String[] args) {
// TextBulider builder=new TextBulider();
// Director director=new Director(builder);
// director.construct();
// String result=builder.getResult();
// System.out.println(result); HTMLBuilder builder =new HTMLBuilder();
Director director=new Director(builder);
director.construct();
String result=builder.getResult();
System.out.println(result);
}
}

23种设计模式之Builder设计模式的更多相关文章

  1. 23种设计模式 - 对象创建(FactoryMethod - AbstractFactory - Prototype - Builder)

    其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 对象创建 通过"对象创建" 模式绕开new,来避免对象创建(new)过程中所导致的紧耦 ...

  2. Java开发中的23种设计模式详解

    [放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...

  3. Java开发中的23种设计模式详解(转)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  4. Java开发中的23种设计模式(转)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  5. c#中的23种设计模式

    C# 23种设计模式汇总 创建型模式 工厂方法(Factory Method) 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节.工厂方法模式的核 ...

  6. Java 23种设计模式

    转自: http://zz563143188.iteye.com/blog/1847029 ; i<count; i++){ list.add(new MailSender()); } } pu ...

  7. 从追MM谈Java的23种设计模式(转)

    从追MM谈Java的23种设计模式    这个是从某个文章转载过来的.但是忘了原文链接.如果知道的,我追加一下. 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西 ...

  8. java 23种设计模式及具体例子 收藏有时间慢慢看

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代 码可靠性. 毫无疑问,设计模式 ...

  9. JAVA:23种设计模式详解(转)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

随机推荐

  1. (办公)记事本_Linux权限

    参考谷粒学院Linux教程:http://www.gulixueyuan.com/course/300/task/7084/show# linux权限,什么用户可以操作什么. 1.基本权限的作用: 1 ...

  2. React-Native三种断点调试方式的流程和优缺点比较

    RN的调试和web端的调试虽然相似,但是也有一些不同,下面就来比较一下三种断点调试方法的差异 总结: 感觉还是第一种好一些 1.React-Native-Debugger工具调试法 1.1 首先我们得 ...

  3. 是时候扔掉 Postman 了,试试 IntelliJ IDEA 自带的高能神器!

    前言 接口调试是每个软件开发从业者必不可少的一项技能,一个项目的的完成,可能接口测试调试的时间比真正开发写代码的时间还要多,几乎是每个开发的日常工作项.所谓工欲善其事必先利其器,在没有尝到 IDEA ...

  4. Linux之shell详解

    Shell是什么 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个界 ...

  5. Oracle - exp实战

    一.概述 exp/imp是oracle中的一个逻辑导出和导入工具,假想一个场景,当我们使用exp命令在对用户进行导出的时候,如果该用户中的某些表的数据有修改,或表结构进行了修改,或者表被删除,那么我们 ...

  6. CF140C New Year Snowmen

    题目链接 这道题其实吧,水,我们教练说过,不要看标签,这只是CSP第一题的题目 思路嘛,priority_queue和贪心,就这样,很水 这是代码 还有,一定要在cf上交,不然--可以看一下提交记录, ...

  7. double小数位数的显示

    不显示小数点后的0,只显示2位小数 DecimalFormat df = new DecimalFormat(".##"); double num = 450.029000089; ...

  8. jQuery仿京东首页广告图片切换图片轮播

    1.效果图如下: 2.源码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  9. [Go] 实现websocket服务端

    直接使用官方子包可以实现websocket协议, golang.org/x/net/websocket 如果在这个目录没有这个包就去github下载net库,放进这个目录$GOPATH/src/gol ...

  10. web测试点集合

    转自:https://blog.csdn.net/yuki_ying/article/details/54946541 web测试点一 .界面检查 进入一个页面测试,首先是检查title,页面排版,字 ...