定义

  "将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现"

  • 最初的定义出现于《设计模式》(Addison-Wesley,1994)。

  看这个概念,可能感觉很是抽象,能看懂但是不知道有什么用。我们打一个比方来理解上面的定义。打比方之前,咱们先来聊聊这个设计模式是干什么用的?我们为什么要用这个模式呢?建造者模式负责将构建复杂对象的过程和它的部件解耦,也就是过程和部件的解耦。比如说汽车,是一个很复杂的对象,它有很多的部件,车轮、发动机、座椅、车门、油箱等等;它的组装过程也很复杂(需要专业人士按步骤进行装配),建造者模式就是为了将部件和组装过程分开的。同样的,我们使用的计算机也一样,有很多的部件,组装过程也很复杂(当然,对于我们这样的专业人士可能感觉不复杂)。建造者模式最大的好处就是使得构建过程和表现分离,因此若需要改变一个产品的表现,只需要重新定义一个具体的建造者就可以了(这句话理解起来有点难度,还是拿车来打比方,我们将车的组装过程独立出来,用这个组装过程,我们即可以组装宝马车,也可以组装奔驰车,或者其他的车型,我们只需要重新定义一个具体的建造者(用于产品表现的类)就可以了)。

动机

  在软件系统中,有时候会遇到一个复杂对象(比如说上面例子中的汽车)的创建,它通常由几个部分的子对象采用一定的算法(过程)构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化(比如上面例子中,各种车型用的车门、方向盘、发动机等,是不一样的),但是将各个部分组合在一起的算法(过程)是相对稳定的

  建造者模式就是在这样的需求下诞生的,它封装了变化点(组成部分),使得同样的构建过程可以创建不同的表现。

结构图

  从结构图可以看到,生成器模式有两个重要的角色:Director(指导者)和Builder(建造者)。Director知道Builder应该建造什么(建造的过程),Builder知道如何建造(表现)。在Director类中定义了一个construct方法,指导具体的建造者ConcreteBuilder的对象去buildPart。Builder是一个抽象接口(协议),该协议中包含建造各个部分的方法(buildPart),用来构建实际的产品Product,另外还有一个getResult方法,用来向客户端返回构建完成的Product。

  这样说不知道大家是不是感觉很抽象?那咱们用一个生活的例子来通俗点说。比如现在我要在老家修一个房子,首先我不知道怎么修房子(砌墙,缺建造者),然后我也不知道怎么设计(修几个房间,房间的布局,房间的窗户怎么设计等等,缺指导者),于是我找来一帮民工(建造者),他们会砌墙;另外我还得找设计师(指导者),他知道怎么设计;最后,我还要确保民工(建造者)听设计师(指导者)的指导,哪里需要砌一堵墙,哪里需要安装窗户等等,这样民工(建造者)就开始盖房子,在这个建造过程中,设计师(指导者)只负责设计和下达命令。房子建成功后,民工(建造者)向我交房。说白了,就是Director(指导者)负责把控宏观方面(过程),Builder(建造者)负责把控微观方面(表现) 。

  下面咱们还是通过代码来说明这个结构图。

建造者模式的代码

  Product.m(部分代码):

 - (id)init

 {

     self = [superinit];

     if (self)

     {

         arrParts = [NSMutableArrayarray];

     }

     returnself;

 }

 - (void)addPart:(NSString *)part

 {

     [arrPartsaddObject:part];

 }

 - (void)show

 {

     for (NSString *strPart inarrParts)

     {

         NSLog(@"%@",strPart);

     }

 }

  Builder.h(部分代码):

 @classProduct;

 @protocol Builder <NSObject>

 - (void)addPartOne;

 - (void)addPartTwo;

 - (Product *)getResult;

 @end

  ConcreteBuilder.m(部分代码):

 - (id)init

 {

     self = [superinit];

     if (self)

     {

         product = [[Productalloc] init];

     }

     returnself;

 }

 - (void)addPartOne

 {

     [productaddPart:@"part one"];

 }

 - (void)addPartTwo

 {

     [productaddPart:@"part two"];

 }

 - (Product *)getResult

 {

     returnproduct;

 }

 Director.m(部分代码):

 - (void)construct:(id<Builder>)builder

 {

     [builder addPartOne];

     [builder addPartTwo];

 }

  客户端调用代码:

         Director *director = [[Directoralloc] init];

         id<Builder> builder = [[ConcreteBuilderalloc] init];

         [director construct:builder];

         Product *product = [builder getResult];

         [product show];

         [builder release];

         [director release];

何时使用建造者模式

  建造者模式常用于如下情形:

  • 需要创建涉及各种部件的复杂对象。创建对象的算法应该独立于部件的装配方式。
  • 构建过程需要以不同的方式构建对象。

  源码下载  返回目录

IOS设计模式浅析之建造者模式(Builder)的更多相关文章

  1. 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...

  2. iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...

  3. 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

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

    一.建造者模式简介(Brief Introduction) 建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示. 建造者模式的优点是 ...

  5. 设计模式 笔记 生成器(建造者)模式 Builder

    //---------------------------15/04/08---------------------------- //builder 生成器(建造者)模式---对象创建型模式 /* ...

  6. IOS设计模式浅析之原型模式(Prototype)

    原型模式的定义 “使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象”.最初的定义出现于<设计模式>(Addison-Wesley,1994). 简单来理解就是根据这个原型创建 ...

  7. IOS设计模式浅析之桥接模式(Bridge)

    引言 在项目开发中,我们会遇到这样的一种场景:某些类型由于自身的逻辑,往往具有两个或多个维度的变化,比如说大话设计模式书中所说的手机,它有两个变化的维度:一是手机的品牌,可能有三星.苹果等:二是手机上 ...

  8. IOS设计模式浅析之外观模式(Facade)

    引言 在项目开发中,有时候会遇到这样的一种情景:已有系统的各个子系统之间,随着业务需求的发展,有了比较紧凑的耦合关系.现在需要利用这些子系统的功能,为移动端提供业务处理.我们该怎么应对这样的业务需求呢 ...

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

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

随机推荐

  1. hyxzc_背包九讲课件

    10 1 1 1 5 5 7 9 //体积 5 5 1 5 3 5 1//价值   01 完全 多重 分组 有依赖性 ... ------------------------------------- ...

  2. 《深入理解Spark-核心思想与源码分析》(一)总体规划和第一章环境准备

    <深入理解Spark 核心思想与源码分析> 耿嘉安著 本书共计486页,计划每天读书20页,计划25天完成. 2018-12-20   1-20页 凡事豫则立,不豫则废:言前定,则不跲:事 ...

  3. 利用Impromptu实现duck typing的封装

    Impromptu是一个动态生成代码实现接口的库,可以非常方便我们实现DuckType编程: public interface IUser    {        string Name { get; ...

  4. 静态html分页

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. Linq To Sql的各种查询

    一.Inner Join   //request为查询条件   var result = from a in db.TableA  join b in db.TableB  on a.ID equal ...

  6. Ado.Net基础拾遗二:插入,更新,删除数据

    插入数据 public void InsertDataToSQL() { string conStr = ConfigurationManager.ConnectionStrings["No ...

  7. SQLSERVER表联结(INNER JOIN,LEFT JOIN,RIGHT JOIN,FULL JOIN,CROSS JOIN,CROSS APPLY,OUTER APPLY)

    1 常用表联结(inner join,left join,right join,full join,cross join) if object_id(N'table1',N'U') is not nu ...

  8. c++之list学习

    #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <list> using namespace std; ...

  9. PHP微信墙制作

    微信墙 PHP 注意:由于微信官网不定时会更新,其中模拟登陆以及爬取数据的方式可能会失效,最近这12个月里,就有两次更新导致此功能需要重写. 服务端源码->github地址传送门 思路 其实实现 ...

  10. PHPer 应聘见闻

    关于我自己 我,很普通的一个开发,88年出生在皖南山区.从小学到高中毕业都没想过自己会从事软件开发,高考的误打误撞,被某普通二本院校收编.大学浑浑噩噩,对软件开发也没多大的兴趣,11年毕业后来杭,面试 ...