概述

建造者模式(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. 63-容器在 Weave 中如何通信和隔离?

    上一节我们分析了 Weave 的网络结构,今天讨论 Weave 的连通和隔离特性. 首先在host2 执行如下命令: weave launch 192.168.0.44 这里必须指定 host1 的 ...

  2. 【杭研大咖说】温正湖:6年,从不会写SQL到数据库专家

    他是业界主流数据库技术会议的明星讲师,开源社区各种分享活动的活跃分子:他累计申请了10多个技术发明专利,已授权8个:他近一年发布60多篇高质量技术博客文章,阅读量数十万:他和团队对MyRocks的优化 ...

  3. centos安装go环境

    centos安装go环境 1,下载合适的go安装包 https://studygolang.com/dl 2 上传到 centos服务器的 /usr/local下然后解压 3.设置go的环境变量    ...

  4. DispatchProxy实现动态代理及AOP

    DispatchProxy类是DotnetCore下的动态代理的类,源码地址:Github,官方文档:MSDN.主要是Activator以及AssemblyBuilder来实现的(请看源码分析),园子 ...

  5. Ligg.EasyWinApp-101-Ligg.EasyWinForm: Application--启动,传入参数、读取Application级别配置文件、验证密码、软件封面、启动登录、StartForm

    首先请在VS里打开下面的文件,我们将对源码分段进行说明: 步骤1:读取debug.ini文件 首先读取当前文件夹(.\Clients\Form)的debug.ini文件,该文件的args用于调试时传参 ...

  6. js-02-循环语句

    循环语句分类{ for while do ( ) while } 一.for循环语句和for循环的嵌套 for循环格式eg: <script> var sim = 0; for(var i ...

  7. 45.QT-连接外部dll,lib库导入问题

    dll库问题 查看MZ_Card.dll对应的文档手册,如下图所示: 所以代码写为: typedef BOOL (*Fun)(BOOL IsOpenComm,unsigned long Port, u ...

  8. 数据库表数据统计及数据表的数据大小统计SQL

    USE [YourDBName] -- replace your dbname GO SELECT s.Name AS SchemaName, t.Name AS TableName, p.rows ...

  9. pycharm中将文件目录标记为sources root和sys.path.append()效果一样

    之前遇到一个问题,先放上项目目录图 右边是main.py,它要引用的一个模块是在LPRNET目录下的一个文件,但是从右边可以看到pycharm有红色的线提示有错误.但是由于我们append函数将该目录 ...

  10. 安装oracle11g客户端

    1.将压缩包instantclient_11_2 解压到数据库安装目录下(D:\app\hisoft\product\11.2.0),即与dbhome_1同级目录 2.添加环境变量 至此,oracle ...