一、概述

  概念

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。(与工厂类不同的是它用于创建复合对象)

  UML图

   

  主要角色

  抽象建造者(Builder)——规范建造方法与结果返还方法

  具体建造者(Concrter Builder)——实现抽象建造接口,给出具体建造并返还具体结果

  指导者(Director)——调用建造者,与客户端对接

  产品(Product)——具体产品

二、实践

  很多时候,一些建造的过程是需要有顺序建造的,一个产品的零件组装也有先后之分(以上一节工厂中的为例,内存和处理器可能会需要一个顺序,比如先处理器后内存)。这个时候就需要使用建造者模式了。建造者模式也是为了之前一直提到的解耦——将构建的复杂过程剥离开。

  按照上面的角色划分使用Java来表示:

  抽象建造者

/**
* 抽象建造者
* 作者: Administrator
* 日期: 2017/10/27
**/
public interface Builder { void buildPart1();
void buildPart2(); /**
* 将以上的部件组装,返回组装后的产品
* @return
*/
Product retrieveResult();
}

  具体建造者

/**
* 具体创建者
* 作者: Administrator
* 日期: 2017/10/27
**/
public class ConcreteBuilder implements Builder{
Part part1,part2; @Override
public void buildPart1() {
// 构建部件1
} @Override
public void buildPart2() {
// 构建部件2
} @Override
public Product retrieveResult() {
// 返回组装后的成品
return null;
}
}

  指导者(导演)

/**
* 指导者(导演)
* 作者: Administrator
* 日期: 2017/10/27
**/
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
} public void construct() {
builder.buildPart1();
builder.buildPart2();
}
}

  产品与部件

/**
* 产品
* 作者: Administrator
* 日期: 2017/10/27
**/
public interface Product {
}
/**
* 产品部件
* 作者: Administrator
* 日期: 2017/10/27
**/
public interface Part {
}

  客户端使用——通过指导者来指导建造,具体建造者返回对象

    客户端只需要建造者和指导者即可得到产品!

    只要给出导演(包工头),和具体建造者(工人),我就可以按照盖楼先从地基打起再做一楼、二楼的顺序盖一座大楼!(注意细节的关注)

public static void main(String[] args) {
ConcreteBuilder builder = new ConcreteBuilder();
Director director = new Director(builder); director.construct();
Product product = builder.retrieveResult();
}

三、改进与思考

  多个产品的拓展

  

  适用性的思考

  这里直接引用《Java与模式》之中的讲述

  

  与工厂模式的区别

  引用自CSDN论坛:

  工厂方法方法应该算是一种思想,即对于一个易变的、目前不确定的东西做个接口,留给以后实现,这样可以达到某种程度的解耦。
抽象工厂也有接口,但它倒不是出于难以确定的目的,而是因为复杂而封装为接口供使用。举个例子来说,桌子由桌面和桌脚两部分组成,
桌面有圆形和方形两种,桌脚有三脚和四脚两种,我们可以封装出一个叫“书桌”的东西供客户使用,只要是说到“书桌”就是指四脚的方桌。
  建造者也是一种封装,只是它封装的是过程。举例来说,钢材可以生产出棒材和钢管两种产品,这两种产品开始总要经过轧机,
最后总要冷却,它们中间也可能有相同的工艺,但我们还是分别把它们封装为棒材流水线和钢管流水线,而不是通过“到某某环节时用某某工艺
”来控制它们的生产流程。
  抽象工厂和建造者都是对复杂东西的封装,使得用户看起来或使用起来简单,只是一个封装的是结构性的东西,
另一个封装的是过程性的东西。这都是oo的封装和接口的思想的运用。   设计模式这个东西就像张无忌学的太极拳,招式只是为了领会精要,一旦领会,就要把具体的招式忘掉。不要拘泥于设计模式的具体形式。

  再看《Java与模式》中的阐述:

  抽象工厂简略图:

  

  建造者模式简略图见文首

  区别:

  

  

  (类似于生产内存和处理器 VS 生产手机的例子,内存和处理器可以再组合)

Java设计模式(5)——创建型模式之建造者模式(Builder)的更多相关文章

  1. JAVA设计模式 4【创建型】理解建造者模式

    Hello,又是拖了几天更,实在是忙的要死,有时候忙累了,真的就是倒头睡的那种,刚好今天闲下来了.今天来更新一篇建造者模式. 其实建造者模式,我们已经在上一节已经有了解过了.只不过是上一节没有提到这样 ...

  2. Java设计模式之创建型模式

    创建型模式分为五类:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 一.工厂方法模式:接口-实现类.工厂类

  3. Java设计模式_创建型模式_单例模式

    单例模式的实现: 定义一个类,在类中定义该类的静态变量,再定一个一个获取该类的静态变量的方法. UML图:

  4. PYTHON设计模式,创建型之工厂方法模式

    我感觉和上一个差不多,可能不要动最要的地方吧... #!/usr/bin/evn python #coding:utf8 class Pizza(object): def prepare(self, ...

  5. PYTHON设计模式,创建型之简单工厂模式

    这个系统,感觉思路清爽,,相信多练练,多思考,就会熟悉的.. http://www.jianshu.com/p/2450b785c329 #!/usr/bin/evn python #coding:u ...

  6. GoF的23种设计模式之创建型模式的特点和分类

    创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”.这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成.就像我们去商场购买商品时, ...

  7. 【python设计模式-创建型】工厂方法模式

    工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻 ...

  8. Python与设计模式之创建型模式及实战

    用Python学习一下设计模式,如果很枯燥的话,就强行能使用的就用一下.设计模式参考Python与设计模式-途索 1. 单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点. import ...

  9. Java设计模式(9)适配器模式(Adapter模式)

    适配器模式定义:将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份. 为何使用适配器模式 我们经常碰到要将两个没有关系的类组合在一起使用 ...

  10. Java设计模式(20)观察者模式(Observer模式)

    Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...

随机推荐

  1. SAP C/4HANA与人工智能和增强现实(AR)技术结合的又一个创新案例

    今天这篇迟到的文章,来自我的同事Aviva. 去年SAP C/4HANA发布之后,SAP的从业者们可能或多或少都读过一些来自SAP官方渠道,比如微信公众号"SAP天天事"发布的一些 ...

  2. bzoj 2111: [ZJOI2010]Perm 排列计数 (dp+卢卡斯定理)

    bzoj 2111: [ZJOI2010]Perm 排列计数 1 ≤ N ≤ 10^6, P≤ 10^9 题意:求1~N的排列有多少种小根堆 1: #include<cstdio> 2: ...

  3. Spring 整合Hibernate 示例

    虽然Spring整合Hibernate早就会了,但经常在创建项目整合这两个框架的时候出一些低级错误.所以在这里写一个示例,以后再遇到错误时,再把遇到的错误或异常添加上. 一.创建一个动态WEB工程,添 ...

  4. PHP单链表的基本操作

    链表的实现 数据结构第一个就是链表了,链表分为两种有直接的数组形式的顺序链,这里不讨论,什么array_push(),array_pop(),函数基本能满足日常的需求,但报告老板,我就是想装个X 上代 ...

  5. 2019.1.2 Spring管理事务的方式

    Spring管理事务的方式 1.编码式 1.将核心事务管理器配置到Spring容器 2.配置TransactionTemplate模版 3.将事务模版注入service 4.在Service中调用模版 ...

  6. Linux下rm -rf删除文件夹报错_ Device or resource busy

    1.错误信息 rm: cannot remove `speechd-centos_6.2-prtl-pred-mf34/modules/t2p/py/third/g2p/.nfs00000000039 ...

  7. 用Java+xml配置方式实现Spring数据事务(编程式事务)

    一.用Java配置的方式 1.实体类: Role public class Role { private int id; private String roleName; private String ...

  8. 【题解】洛谷P1032 [NOIP2002TG]字串变换(BFS+字符串)

    洛谷P1032:https://www.luogu.org/problemnew/show/P1032 思路 初看题目觉得挺简单的一道题 但是仔细想了一下发现实现代码挺麻烦的 而且2002年的毒瘤输入 ...

  9. HDU 1029 Ignatius and the Princess IV (map的使用)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1029 Ignatius and the Princess IV Time Limit: 2000/10 ...

  10. 工程命名为***&***出现的问题: LaunchScreen.xib: Line 20: EntityRef: expecting ';'

    今天新建一个项目命名为28 & 29. extern&static,  然后cmd + R运行,居然碰到了编译错误. 当时就奇怪了,怎么会这样呢?报错内容如下: 开始还以为新安装的Xc ...