PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN。因为CSDN也支持MarkDown语法了,牛逼啊!

【工匠若水 http://blog.csdn.net/yanbober】 阅读前一篇《设计模式(创建型)之单例模式(Singleton Pattern)》 http://blog.csdn.net/yanbober/article/details/45312675

概述

建造者模式将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端压根不用知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可。它关注如何一步一步创建一个的复杂对象,不同的具体建造者定义了不同的创建过程,且具体建造者相互独立,增加新的建造者非常方便,无须修改已有代码,系统具有较好的扩展性。

问题来了。。。

你可能会有疑惑,建造者模式和抽象工厂模式有啥区别呢?

其实,在建造者模式里有个指导者,由指导者来管理建造者,用户是与指导者联系的,指导者联系建造者最后得到产品。即建造模式可以强制实行一种分步骤进行的建造过程。而抽象工厂模式不具备最终的这个直接创建功能。建造者模式与工厂模式是极为相似的,总体上,建造者模式仅仅只比工厂模式多了一个“导演类”的角色。假如把这个导演类看做是最终调用的客户端,那么剩余的部分就可以看作是一个简单的工厂模式了。

与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的导演类。

也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。

核心

概念: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。

重点: 建造者模式结构重要核心模块:

Builder(抽象建造者)

它为创建一个产品对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法是buildXXX(),它们用于创建复杂对象的各个部件;另一类方法是getXXX(),它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口。

ConcreteBuilder(具体建造者)

它实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。

Product(产品角色)

它是被构建的复杂对象,包含多个组成部件,具体建造者ConcreteBuilder创建该产品的内部表示并定义它的装配过程。

Director(指挥者)

指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象,然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥者类中。

什么是复杂对象:是指那些包含多个成员属性的对象,这些成员属性也称为部件或零件,如程序猿要会识字、会数学、会编程语言,会设计模式等等。

使用场景

需要生成的产品对象有复杂的内部结构,每一个内部成分本身可以是对象,也可以仅仅是一个对象的一个组成部分。

需要生成的产品对象的属性相互依赖。建造模式可以强制实行一种分步骤进行的建造过程,因此,如果产品对象的一个属性必须在另一个属性被赋值之后才可以被赋值,使用建造模式是一个很好的设计思想。

在对象创建过程中会使用到系统中的其他一些对象,这些对象在产品对象的创建过程中不易得到。

程序猿实例

如下实例就是一个建造者模式的简单实现,具体ProgramMonkey就是产品角色,Builder就是抽象建造者,ConcreteProgramMonkey就是具体建造者,Director就是导演指挥者,负责创造两个程序猿(我们要造人了),一个Low逼,一个大牛High。

package yanbober.github.io;
//Product(产品角色)
class ProgramMonkey {private boolean mIsLiterated;private boolean mKnowMath;private String mLanguage;private boolean mKnowDesign;public boolean ismIsLiterated() {return mIsLiterated;}public void setmIsLiterated(boolean mIsLiterated) {this.mIsLiterated = mIsLiterated;}public boolean ismKnowMath() {return mKnowMath;}public void setmKnowMath(boolean mKnowMath) {this.mKnowMath = mKnowMath;}public String getmLanguage() {return mLanguage;}public void setmLanguage(String mLanguage) {this.mLanguage = mLanguage;}public boolean ismKnowDesign() {return mKnowDesign;}public void setmKnowDesign(boolean mKnowDesign) {this.mKnowDesign = mKnowDesign;}public void show() {System.out.println("\rIsLiterated="+mIsLiterated+"\n"+"KnowMath="+mKnowMath+"\n"+"Language="+mLanguage+"\n"+"KnowDesign="+mKnowDesign+"\n");}
}
//Builder(抽象建造者)
abstract class Builder {public abstract void buildIsLiterated(boolean arg);public abstract void buildKnowMath(boolean arg);public abstract void buildLanguage(String arg);public abstract void buildKnowDesign(boolean arg);public abstract ProgramMonkey getMonkey();
}
//ConcreteBuilder(具体建造者)
class ConcreteProgramMonkey extends Builder {private  ProgramMonkey mMonkey = new ProgramMonkey();@Overridepublic void buildIsLiterated(boolean arg) {mMonkey.setmIsLiterated(arg);}@Overridepublic void buildKnowMath(boolean arg) {mMonkey.setmKnowMath(arg);}@Overridepublic void buildLanguage(String arg) {mMonkey.setmLanguage(arg);}@Overridepublic void buildKnowDesign(boolean arg) {mMonkey.setmKnowDesign(arg);}@Overridepublic ProgramMonkey getMonkey() {return mMonkey;}
}
//Director(指挥者)
class Director {private Builder builder = new ConcreteProgramMonkey();public ProgramMonkey getMonkeyLow() {builder.buildIsLiterated(true);builder.buildKnowMath(true);builder.buildLanguage("Android");builder.buildKnowDesign(false);return builder.getMonkey();}public ProgramMonkey getMonkeyHigh() {builder.buildIsLiterated(true);builder.buildKnowMath(true);builder.buildLanguage("Android/Java/Designer");builder.buildKnowDesign(true);return builder.getMonkey();}
}public class Main {public static void main(String[] args) {Director director = new Director();ProgramMonkey monkey = director.getMonkeyLow();monkey.show();monkey = director.getMonkeyHigh();monkey.show();}
}

技巧Tips:依旧可以使用配置与反射实现自动适应。

总结一把

建造者模式优点:

  • 建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。

  • 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。由于指挥者类针对抽象建造者编程,增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合“开闭原则”。

  • 可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰。

建造者模式缺点:

  • 建造者模式所创建的产品具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,不适合使用建造者模式,因此其使用范围受到一定的限制。

  • 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加系统的理解难度和运行成本。

【工匠若水 http://blog.csdn.net/yanbober】 继续阅读《设计模式(创建型)之原型模式(Prototype Pattern)》 http://blog.csdn.net/yanbober/article/details/45363525

设计模式(创建型)之建造者模式(Builder Pattern)相关推荐

  1. java设计模式——创建型之建造者模式

    自大学课程初识设计模式以来,就越发觉得有必要系统学习一下设计模式. 刚好在实习前准备期间课比较少,抽出一点时间整理一下记一些笔记,复制粘贴比较多. 笔记比较适合学习过设计模式的同学. Builder ...

  2. Java设计模式之创建型:建造者模式

    一.什么是建造者模式: 建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程:通过隔离复杂对象的构建与使用,也就是将产品的创建与产品本身分离开来, ...

  3. 【创建型】建造者模式(Builder Pattern)

    主要作用: 可以使多个简单的对象,一步一步构建成一个复杂的对象 应用实例: 1.去肯德基,汉堡.可乐.薯条.炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐". 2.JA ...

  4. 每天学习一个设计模式(九):创建型之建造者模式

    目录 一.基本概念 二.通俗解释 三.建造者模式详解 1.造车的例子 2.建造者模式的结构 3.建造者模式的优点 4.使用场景 5.注意事项 四.建造者模式的扩展和最佳实践 建造者模式的扩展 最佳实践 ...

  5. Net设计模式实例之建造者模式(Builder Pattern)(2)

    四.案例分析(Example) 1.场景 假设房子只有房顶和墙(Roof And Walls)<?XML:NAMESPACE PREFIX = O /> Jane和 Joe两个客户需要从建 ...

  6. Python 设计模式之建造者模式 Builder Pattern

    #引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...

  7. UE4 C++设计模式:建造者模式(Builder Pattern)

    目录 描述 套路 使用场景 优缺点 UE4实践 具体复杂产品-门派角色 抽象建造者-角色构造器 具体建造者-纯阳角色构造器 具体建造者-七秀角色构造器 创建指挥者(Director)-角色创建指挥器 ...

  8. 大厦设计师 -- 建造者模式 (Builder Pattern) 介绍 使用案例场景分析 优缺点 及代码演示

    一句话概括: 使用多个简单对象一步一步构建成复杂对象,将复杂对象的构建与表示相分离. 补充介绍: 建造者模式(Builder Pattern)中有一个 Builder 类,这个类会一步一步构造最终的对 ...

  9. Java设计模式之创建型:原型模式

    一.什么是原型模式: 原型模式主要用于对象的创建,使用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.UML类图如下: 原型模式的核心是就是原型类 Prototype,Prototype ...

最新文章

  1. CSS兼容性(IE和Firefox)技巧大全
  2. Msg3最大传输次数(maxHARQ-Msg3Tx)
  3. python 项目中的requirements.txt文件
  4. Android - aar文件资源重复引起的打包失败解决方法
  5. Android模拟位置出错IllegalArgumentException: Incomplete location object, missing timestamp or accuracy?
  6. SQL性能优化案例分析
  7. vue中router-link绑定click失效
  8. linux路由内核实现分析(一)----邻居子节点(1)
  9. sourceTree初识
  10. mysql主从(一)--搭建(GTID+row+增强半同步)
  11. awk和perl对多文本进行统计(求他们的并集,并且如果前三列相同第四列的数字相加,第五列信息合并)...
  12. 计算机0812是学硕还是专硕,的计算机是专硕还是学硕
  13. 【TWVRP】基于matlab遗传算法和模拟退火求解带时间窗自行车调度问题【含Matlab源码 370期】
  14. linux 6.5 dos2unix,dos2unix 安装
  15. 常见物质相对介电常数(室温,频率低于1kHz)
  16. 如何使用krpano全景资源下载器来下载720yun的全景图
  17. xshell查看hdfs文件目录路径_hdfs的shell操作
  18. callmode php_phper必须了解的php常识
  19. Python读文件报错:SyntaxError: Non-ASCII character in file
  20. 桌面cpu与服务器cpu天梯,桌面CPU性能排行 桌面CPU天梯图2017年6月最新版

热门文章

  1. GAMES101-现代计算机图形学入门-闫令琪——Lecture 05 Rasterization 1 (Triangles)
  2. 电脑经验--bois用pe进不去,更改UEFI
  3. java开发调用海康威视摄像头的web端页面开发心得
  4. 线上线下相结合将成为未来的教育趋势
  5. PHP对HTML编码字符串的处理
  6. 大型商场借力泛微,实现内外协同招商,合同、铺位、费用统一管理
  7. 鼎信通达GOIP网关SIM网关介绍 可对接AI机器人
  8. usb由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个硬件设备(代码 19)
  9. while(--i) 和 while(i--) 区别
  10. Pyppeteer+Python爬取京东商品详情demo