服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS App设计模式开发中对建造者模式的运用实例

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

2021-01-14 18:19Gof Lee IOS

这篇文章主要介绍了iOS App设计模式开发中对建造者模式的运用实例,示例代码为传统的Objective-C,需要的朋友可以参考下

定义                                                                                                       

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

动机                                                                                                       

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

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

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

建造者模式包含产品类(product)、抽象建造者类(builder)、具体建造者类(concretebuilder1、concretebuilder2…)和指挥者类(director)

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

复制代码 代码如下:

personbuilder *builder = [[personthinbuilder alloc]init];
personview *personview = [persondirector creatperson:builder];


其中 personbuilder 是抽象建造者类,personthinbuilder 是具体建造者类,personview 是产品类,persondirector 是指挥者类。

 

由代码了解使用方式:

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

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

结构图

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

从结构图可以看到,生成器模式有两个重要的角色: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,只是叫法不同而已。

延伸 · 阅读

精彩推荐
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28