定义:

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

结构图:

  • 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. CCNA基础 IP地址子网划分

    计算机是一个非常神奇的物品,它的核心算法是凌驾于任何代码架构.然而互联网网络( Internat )作为整个生态的基础资源.什么?你还不会子网划分? 没关系,看到子网掩码不要怕.因为它无非就是问你 & ...

  2. javascript类型系统——Number数字类型

    × 目录 [1]定义 [2]整数 [3]浮点数[4]科学记数[5]数值精度[6]数值范围[7]特殊数值[8]转成数值[9]实例方法 前面的话 javascript只有一个数字类型,它在内部被表示为64 ...

  3. 用命令行编译java并生成可执行的jar包

    用命令行编译java并生成可执行的jar包 1.编写源代码. 编写源文件:CardLayoutDemo.java并保存,例如:I:\myApp\CardLayoutDemo.java.程序结构如下: ...

  4. 硬刚Google ,这家小公司的增长团队长啥样

    背景: AdRoll 是一家主打重定向广告(Retargeting)服务的技术公司,基于用户浏览记录等信息,为广告主提供几乎瞬时的广告位购买服务,当前估值15.5亿美元.吊打谷歌, AdRoll 已经 ...

  5. Asp.Net工作原理

    1. ASP.NET页面的的一般处理过程: 客户请求WEB页面 WEB服务寻找指令文件(.ASPX) ASP.NET代码被发送给CLR进行编译 HTML流返回给浏览器和指令 浏览器处理HTML并显示页 ...

  6. HT for Web列表和3D拓扑组件的拖拽应用

    很多可视化编辑器都或多或少有一些拖拽功能,比如从一个List列表中拖拽一个节点到拓扑组件上进行建模,并且在拖拽的过程中鼠标位置下会附带一个被拖拽节点的缩略图,那么今天我们就来实现这样的拖拽效果. 首先 ...

  7. ASP.NET MVC必知必会知识点总结(一)

    一.URL Routing 1.添加URL路由映射的一般方法(在RegisterRoutes方法中添加): //第一种(建议采用这种): routes.MapRoute( "MyRoute& ...

  8. nodejs学习篇 (1)webstorm创建nodejs + express + jade 的web 项目

    之前简单了解过nodejs,觉得用nodejs来做个网站也太麻烦了,要自己拼html的字符串返回,这能做网站嘛? 最近看到使用jade模板来开发,觉得挺新奇的,于是试了一把,也了解了一些特性,算是个新 ...

  9. C语言学习010:fopen读写文件

    在文件input.csv文件中,我们有数据如下 Apple Pear Litchis Pineapple Watermelon 现在我们将input.csv文件下的读取并写入到output.csv文件 ...

  10. [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(4)

    这个系列已经写了6篇,链接地址如下: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Auto ...