美文网首页
十一、建造者模式

十一、建造者模式

作者: LeeLeCoder | 来源:发表于2017-06-20 17:23 被阅读0次

1. 何为建造者模式

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

建造者模式负责将构建复杂对象的过程和它的部件解耦,也就是过程和部件的解耦。比如说汽车,是一个很复杂的对象,它有很多的部件,车轮、发动机、座椅、车门、邮箱等等;它的组装过程也很复杂(需要专业人士按照步骤进行装配),建造者模式就是为了将部件和组装过程分开。

建造者模式最大的好处就是使得构建过程和表现分离,因此若需要改变一个产品的表现,只需重新定义一个具体的建造者就可以了。举个例子,我们将车的组装过程独立处来,用这个组装过程可以组装出宝马、奔驰或者其他车型,如果要组装新的车型,我们只需要重新定义一个具体的构造者(用于产品表现的类)就可以了。

2. 情景设置

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

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

图2-1

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

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

3. 代码实现

(1)Product

@interface Product : NSObject
{
    NSMutableArray *arrParts;
}

- (void)addPart:(NSString *)part;  // 添加产品的各个部分
- (void)show;  // 展示产品

@end


@implementation Product

- (instancetype)init
{
    if (self = [super init]) {
        arrParts = [NSMutableArray array];
    }
    return self;
}

- (void)addPart:(NSString *)part
{
    [arrParts addObject:part];
}

- (void)show
{
    for (NSString *strPart in arrParts)
    {
        NSLog(@"%@",strPart);
    }
}

@end

(2)Builder

@class Product;
@protocol Builder <NSObject>

- (void)addPartOne;
- (void)addPartTwo;
- (Product *)getResult;

@end

(3)Director

@interface Director : NSObject

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

@end


@implementation Director

- (void)construct:(id<Builder>)builder
{
    [builder addPartOne];
    [builder addPartTwo];
}

@end

(4)ConcreteBuilder

@interface ConcreteBuilder : NSObject<Builder>
{
    Product     *product;
}

@end


@implementation ConcreteBuilder

- (instancetype)init
{
    if (self = [super init]) {
        product = [[Product alloc] init];
    }
    return self;
}

- (void)addPartOne
{
    [product addPart:@"part one"];
}

- (void)addPartTwo
{
    [product addPart:@"part two"];
}

- (Product *)getResult
{
    return product;
}
@end

(5)客户端调用

 Director *director = [[Director alloc] init];
 id<Builder> builder = [[ConcreteBuilder alloc] init];
        
[director construct:builder];
Product *product = [builder getResult];
[product show];

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

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

相关文章

  • Builder Pattern in Java

    建造者模式:建造者模式定义建造者模式应用场景实现案例Jdk中的建造者模式建造者模式的优点建造者模式的缺点 建造者模...

  • 十一、建造者模式

    1. 何为建造者模式 定义:将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现。 建造者模式...

  • 设计模式(4) 建造者模式

    什么是建造者模式 经典建造者模式的优缺点 对建造者模式的扩展 什么是建造者模式 建造者模式将一个复杂的对象的构建与...

  • 建造者模式(部件构造)

    目录 建造者模式的理念 从 POJO 到建造者模式的思考 怎么来实现建造者模式 建造者模式在Android源码中的...

  • 【设计模式】之建造者Builder模式

    建造者模式 什么是建造者模式? 建造者模式属于创建型模式的一员,可以控制对象的实例化过程。建造者模式简化了复杂对象...

  • 建造者模式

    一、建造者模式介绍 二、建造者模式代码实例

  • 建造者模式

    建造者模式 首先,建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和...

  • 建造者模式:深入理解建造者模式 ——组装复杂的实例

    目录: 一 建造者模式介绍 1.1 定义 1.2 为什么要用建造者模式(优点)? 1.3 哪些情况不要用建造者模式...

  • 设计模式之建造者模式

    设计模式之建造者模式 Intro 简介 建造者模式: 建造者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加...

  • 一、设计模式(构建模式)——03建造模式与原型模式

    建造者模式 建造型模式用于创建过程稳定,但配置多变的对象。 建造模式的实现要点: 在建造者模式中,指挥者是直接与客...

网友评论

      本文标题:十一、建造者模式

      本文链接:https://www.haomeiwen.com/subject/avqaqxtx.html