定义:

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

结构图:

  • 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. angularjs学习曲线

    angularjs学习曲线 刚开始学Augular觉得开发应用需要有相当的编程基础. 不得不说这确实是一款了不起的开发框架,它要求开发人员设计低耦合和可维护的应用. 使用AngularJS 的复杂度就 ...

  2. Python的datetime

    Python的datetime 总会用到日期格式化和字符串转成日期,贴点代码以供参考,其实API真的是很全的,可是又不知道具体的method... datetime.datetime.strftime ...

  3. 部署到IIS报错:HTTP错误500.19,错误代码0x800700d

    title=部署到IIS报错:HTTP错误500.19,错误代码0x800700d.   用vs直接运行网站没问题,部署到IIS就报错,由此可知应该是IIS中不支持网站相关配置. 查找发现在web.c ...

  4. python 反射的使用

    反射这个功能在很多编程语言中都有,在Python中自然也不例外.其实编程语言中的很多功能都能用简单的代码来验证. 在code代码之前,先简单的了解下反射的几个属性. hasattr(obj,name_ ...

  5. jsoup简单的爬取网页数据

    /** * Project Name:JavaTest * File Name:BankOfChinaExchangeRate.java * Package Name:com.lee.javatest ...

  6. 信息加密之非对称加密DH算法

    非对称加密算法是相对于对称加密算法来说的,对于对称加密算法请查阅之前的总结,今天为大家介绍一下DH算法,DH是一种密钥交换算法,接收方根据发送方加密时的密钥,生成接收方解密密钥.下面就一起来学习一下吧 ...

  7. HTML5第一讲

    第一回合:什么是HTML5? HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML 的上一个版本诞生于 1999 年.自从那以后,Web 世界已经经历了巨变. HTM ...

  8. [New Portal]Windows Azure Virtual Machine (23) 使用Storage Space,提高Virtual Machine磁盘的IOPS

    <Windows Azure Platform 系列文章目录> 注意:如果使用Azure Virtual Machine,虚拟机所在的存储账号建议使用Local Redundant.不建议 ...

  9. web项目中,视图层中关于相对路径和绝对路径

    1.在jfinal项目中 因为一直使用的jfinal,没感觉路径问题. 举个栗子,项目名字叫做test.访问一个Controller的映射为/user/add.这样,在浏览器地址栏直接:localho ...

  10. 11款扁平化设计的 Twitter Bootstrap 主题和模板

    扁平化设计和 Bootstrap 框架是2013年网页设计领域的两大设计潮流.把这两者集合起来不是件容易的事情,使用下面这些主题和模板将节省我们的开发时间,因为我们可以修改已有的基础代码,而不是从零开 ...