定义:

将一个复杂的对象的构建与它的表示分类,使得同样的构建过程可以创建不同的表示。建造者模式一步步地创建一个复杂对象,但用户仅需指定对象的类型和内容,不需要关心各个部分之间的关联关系。

结构图:

  • Builder:抽象建造者,为创建产品定义抽象接口。一般含有两类:buildPartX()方法,用于常见产品的各个部分;getResult()方法,用于返回创建结果。
  • ConcreteBuilder:具体建造者,实现了Builder接口,对一种具体复杂产品进行创建。
  • Product:产品类,含有多个组成部分,具体创建者创建该产品,并定义它的装配过程。
  • Director:指挥类,负责安排复杂对象各个部分之间的创建次序,与建造者之间存在关联关系,需要具体的建造者才能生效。客户端一般只需要和指挥类交互,隐藏了复杂产品的建造细节。

注意:

  • 生产出来的商品依赖于建造者的build方法,build方法中一般会对product进行各种各样的改造,这样对于同一种产品可以有各个部分可以有不同的表示。
  • 指挥类主要有两个作用:一是隐藏产品的建造细节,而是控制产品的创建过程。
  • 建造模式和抽象工厂模式有一定的区别,抽象工厂模式会返回一系列相关的产品,而建造者模式只会返回一种产品,但其每部确实可以灵活多变的。
  • 在一些特殊情况下可以将指挥者和抽象建造者进行合并,在抽象建造者加入静态方法constractor(),然后传入一个具体builder而返回一个产品对象。
  • 可以通过Director类更精细地控制产品的创建过程,因此可以根据设置值的具体内容在Builder内部添加钩子方法。这些通常是boolean类型,方法名一般为isXXX()。在Director中,通过调用这些方法判断分支情况,改变产品类的创建过程。

优点:

  • 客户不知道产品的具体组成细节,不同的创建过程可以构造出不同的产品,将产品本身和产品进行解耦。如果需要不同类型的产品,只需要新添构造类就可,不需要改造产品类。
  • 根据产品的不同属性,可以在Director中更加精细地控制产品创建过程。

缺点:

  • 产品的整体结构内容不能变,只能是各个部分属性的调整。如果产品结构类型差别很大,则不能使用建造者模式。
  • 如果产品种类较多并且产品创建复杂,则需要很多具体建造者来实现,导致系统不可维护。

适用场景:

  • 产品内部是由各个部分组合而成,包含多个成员属性。且这些成员相互依赖,需要制定生成顺序。

实例:

BuilderPattern.java

六个创建模式之建造者模式(Builder Pattern)的更多相关文章

  1. 2015-03-12---外观模式,建造者模式(附代码),观察者模式(附代码),boost库应用

    今天白天主要看了boost库的应用,主要是经常使用的一些库,array,bind,function,regex,thread,unordered,ref,smartpointers库,晚上看了看设计模 ...

  2. 【设计模式】 模式PK:工厂模式VS建造者模式

    1.概述 工厂方法模式注重的是整体对象的创建方法,而建造者模式注重的是部件构建的过程,旨在通过一步一步地精确构造创建出一个复杂的对象.我们举个简单例子来说明两者的差异,如要制造一个超人,如果使用工厂方 ...

  3. 【设计模式】 模式PK:抽象工厂模式VS建造者模式

    1.概述 抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式则是不需要关心构建过程,只关心什么产品由什么工厂生产即可.而建造者模式则是要求按 ...

  4. .NET设计模式 第二部分 创建型模式(3)—建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) ——.NET设计模式系列之四 Terrylee,2005年12月17日 概述 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对 ...

  5. Java设计模式(5)——创建型模式之建造者模式(Builder)

    一.概述 概念 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.(与工厂类不同的是它用于创建复合对象) UML图   主要角色 抽象建造者(Builder)——规范建造方法与结果 ...

  6. (转自精通Python设计模式)Python设计模式之创建型模式——2.建造者模式

    建造者模式将一个复杂对象的构造过程与其表现分离,这样,同一个构造过程可用于创建多个不同的表现. 我们来看个实际的例子,假设我们想要创建一个HMTL页面生成器,HTML页面的基本结构(构造组件)通常是一 ...

  7. java模式:建造者模式

    我发现很多源码很喜欢用这个模式,比如spring cloud,spring framework. 建造者模式(Builder)用以构建各种各样的对象,主要功能就是代替对象的构造函数,更加自由化. 举个 ...

  8. GoF23种设计模式之创建型模式之建造者模式

    一.概述 将一个复杂对象的构建与其表示分离开来,使得同样的构建过程可以创建不同的表示. 二.适用性 1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式的时候. 2.当构造过程必须允许 ...

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

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

随机推荐

  1. KnockoutJS 3.X API 第四章 数据绑定(4) 控制流with绑定

    with绑定的目的 使用with绑定的格式为data-bind="with:attribute",使用with绑定会将其后所跟的属性看作一个新的上下文进行绑定.with绑定内部的所 ...

  2. Android线程机制——AsyncTask

    对于Android为什么要使用多线程,因为从Android4.0之后,谷歌规定了网络操作不允许放在主线程中执行,由此就有了多线程的机制,有个JAVA学习经验的朋友一定知道多线程指的是什么,简单来讲就是 ...

  3. IOS开发-KVO

    一.什么是kvo? key-value observing,观察者模式 观察者,观察对象属性的变化,当被观察者该属性发生变化时,观察者会接收到通知,可以在回调函数中做相应的处理 二.有什么作用? 变化 ...

  4. [转]JVM指令详解(上)

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 本文主要记录一些JVM指令,便于记忆与查阅. 一.未归类系列A 此系列暂未归类. 指令码    助记符      ...

  5. solr:快速开始

    本文已挪至  http://www.zhoujingen.cn/blog/8535.html 明年工作主要和搜索有关,在自己学习过程中分享让更多人受益是我一贯的做法,所以我会把对Solr的学习在这里与 ...

  6. solr的suggest模块

    solr的suggest模块 solr有个suggest模块,用来实现下拉提醒功能,就是输入了一个文本之后,进行文本建议查找的功能. suggest请求的url http://localhost:89 ...

  7. SpringIOC使用扩展

    在上篇博客中,我们使用Spring通过setter访问器实现了对属性的赋值,这种做法被称为设值注入.除此之外Spring还提供了通过构造方法赋值的能力,成为构造注入.下面我们通过一个小demo来了解如 ...

  8. ROS 常用命令字典

    版权声明:本文为博主原创文章,转载请标明出处: http://www.cnblogs.com/liu-fa/p/5761448.html 该博文适合已经具备一定的ROS编程基础的人,快速查看ROS相关 ...

  9. [JS] 使用RequireJS引用UMeditor

    UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码. 而UMeditor则是UEditor删减版. ...

  10. 问得最多的十个JavaScript前端面试问题

    我知道有很多人不同意这种类型的面试.其实不管你喜不喜欢,你都得接受.尤其当你是自学的,而且要申请第一份工作时.   我估计很多有人其它方法来证明他自己,像Github/ 项目地址可能是非常理想的证明方 ...