1. 程式人生 > >ios大話設計模式-建造者模式

ios大話設計模式-建造者模式

ios建造者模式

本質:

將一個複雜物件的構建與他的表示分離,
使得同樣的構建過程建立不同的表示。

解釋:

**請反覆多度幾遍,理解的寫的不是按照書上照抄**
同樣的構建過程可以建立不同的表現,
構建過程需要獨立出來,這裡的構建過程我們稱為指導者,
而生成器是可以被切換的具體實現,
在ios中我們可以用一個協議替代生成器,
遵守這個協議的物件就是生成器生成的物件。

這裡寫圖片描述

一句話記住: 同一指導者不同生成器就可以生產不同的產品來

指導者有兩個主要的方法

a.初始化方法 根據生成器具體的物件來初始化
b.暴漏對應的buildxx方法  方法裡是對應的構建過程

我們以一個人為例子

先定義人的指導者
a.initWithBuilder:生成器物件
b.buildPerson 構建過程的封裝方法呼叫

再定義生成器

iOS 用協議 規範 (繼承表示也可,不過協議方便)
protocol 生成器 
build head
build body
build foot

生成器生成具體的生成器物件 xxxbuilder

thinPersonBuilder
fatPersonBuilder 
由於遵守了協議 
在對應.m檔案就是相關物件的具體表示了

程式碼如下
PersonBuilderProtocol.h

#import <Foundation/Foundation.h>

@protocol PersonBuilderProtocol <NSObject>

-(void)buildHeader;
-(void)buildBody;
-(void)buildFeat;
@end

#import "ThinPersonBuilder.h"
@implementation ThinPersonBuilder
-(void)buildBody
{
    NSLog(@"thin%s",__func__);

}

-(void)buildHeader
{
    NSLog(@"thin%s",__func__);

}

-(void)buildFeat
{
    NSLog(@"thin%s",__func__);

}

#import "FatPersonBuilder.h"

@implementation FatPersonBuilder
-(void)buildBody
{
    NSLog(@"fat%s",__func__);

}

-(void)buildHeader
{
    NSLog(@"fat%s",__func__);

}

-(void)buildFeat
{
    NSLog(@"fat%s",__func__);

}

@end

PersonDirector

#import <Foundation/Foundation.h>
#import "PersonBuilderProtocol.h"


@interface PersonDirector : NSObject 
-(instancetype)initWithPersonBuilder:(id<PersonBuilderProtocol>)builder;
-(void)buildPerson;
@end


#import "PersonDirector.h"


@interface PersonDirector ()

@property(nonatomic, weak) id <PersonBuilderProtocol> builder;
@end

@implementation PersonDirector

-(instancetype)initWithPersonBuilder:(id<PersonBuilderProtocol>)builder
{
    if (self==[super init]) {

        _builder = builder;
    }
    return self;
}

-(void)buildPerson
{
    [self.builder buildHeader];

    [self.builder buildBody];

    [self.builder buildFeat];
}

具體呼叫

ThinBuilder* thinBuilder = [[ThinBuilder alloc] init];

PersonDirector* thinDirector = [[PersonDirector alloc] initWithPersonBuilder:thinBuilder];

[thinDirector buildPerson];

FatBuilder* fatBuilder = [[FatBuilder alloc] init];

PersonDirector* fatDirector = [[PersonDirector alloc] initWithPersonBuilder:fatBuilder];

[fatDirector buildPerson];


    2016-09-03 22:04:40.402 01-builder模式[3970:40414] thin-[ThinBuilder buildHeader]
2016-09-03 22:04:40.403 01-builder模式[3970:40414] thin-[ThinBuilder buildBody]
2016-09-03 22:04:40.403 01-builder模式[3970:40414] thin-[ThinBuilder buildFeat]
2016-09-03 22:04:40.403 01-builder模式[3970:40414] fat-[FatBuilder buildHeader]
2016-09-03 22:04:40.403 01-builder模式[3970:40414] fat-[FatBuilder buildBody]
2016-09-03 22:04:40.403 01-builder模式[3970:40414] fat-[FatBuilder buildFeat]

碼字不容易希望大家多多支援點個贊。。謝謝thx