当前位置: 首页 > 编程笔记 >

iOS App设计模式开发中对建造者模式的运用实例

王刚毅
2023-03-14
本文向大家介绍iOS App设计模式开发中对建造者模式的运用实例,包括了iOS App设计模式开发中对建造者模式的运用实例的使用技巧和注意事项,需要的朋友参考一下

定义                                                                                                       

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

动机                                                                                                       

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

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

建造者模式是当在创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。

建造者模式包含产品类(Product)、抽象建造者类(Builder)、具体建造者类(ConcreteBuilder1、ConcreteBuilder2…)和指挥者类(Director)

从下面的代码中看各个类的使用:


PersonBuilder *builder = [[PersonThinBuilder alloc]init];

PersonView *personView = [PersonDirector creatPerson:builder];


其中 PersonBuilder 是抽象建造者类,PersonThinBuilder 是具体建造者类,PersonView 是产品类,PersonDirector 是指挥者类。

由代码了解使用方式:

1、创建具体建造者。
2、指挥者通过具体建造者来返回产品。

感觉建造者模式与工厂方法模式非常类似,但是加入了指挥者类。

结构图

从结构图可以看到,生成器模式有两个重要的角色: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];

何时使用建造者模式                                                                                

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

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

PS:在FaceBook的开源动画框架POP中也有对builder pattern类似的应用:

POPAnimatableProperty *animatableProperty = [POPAnimatableProperty propertyWithName:@"property" initializer:^(POPMutableAnimatableProperty *prop) {     prop.writeBlock = ^(id obj, const CGFloat values[]) {     };     prop.readBlock = ^(id obj, CGFloat values[]) {     }; }];


这里的initializer本质上就是builder,只是叫法不同而已。

 类似资料:
  • 介绍 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式。 建造者模式可以将一个复杂对象的构建与其表

  • 本文向大家介绍Java运用设计模式中的建造者模式构建项目的实例解析,包括了Java运用设计模式中的建造者模式构建项目的实例解析的使用技巧和注意事项,需要的朋友参考一下 1.建造者模式概念 定义: 将一个复杂的对象构建与其表示相分离,使得同样的构建过程可以创建不同的表示; 核心 : 构建与表示分离,同构建不同表示 区别于 抽象工厂模式 : (1)与抽象工厂模式 相似,因为它也可以创建复杂对象。主要的

  • 本文向大家介绍Ruby设计模式编程中使用Builder建造者模式的实例,包括了Ruby设计模式编程中使用Builder建造者模式的实例的使用技巧和注意事项,需要的朋友参考一下 先来复习一下设计模式的基本概念: 定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要重新定一个建造者就可以了。 实用范围

  • 本文向大家介绍JavaScript设计模式之建造者模式介绍,包括了JavaScript设计模式之建造者模式介绍的使用技巧和注意事项,需要的朋友参考一下 建造者模式说明 1. 将一个复杂对象的 构造 与它的表示相分离,使同样的创建过程可有不同的表示,这就叫做建造者模式。 2. 面向对象语言中的说明,主要角色: 1>. Builder 这个接口类,定义这个建造者[工人],统一的可操作的行为方式,它表示

  • 本文向大家介绍Java设计模式之建造者模式(Builder模式)介绍,包括了Java设计模式之建造者模式(Builder模式)介绍的使用技巧和注意事项,需要的朋友参考一下 Builder模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们。用户不知道内部的具体

  • 本文向大家介绍实例解析Ruby设计模式开发中对观察者模式的实现,包括了实例解析Ruby设计模式开发中对观察者模式的实现的使用技巧和注意事项,需要的朋友参考一下 一般来说,观察者模式的定义应该是这样的:building a clean interface between the source of news that some object has changed and the consumers