Objective-C 生成器模式 -- 簡單實用和說明

1.生成器模式的定義
將一個復雜的對象的構(gòu)件與它的表示分離周崭,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示

2.生成器模式的UML

Paste_Image.png

Builder :生成器接口,定義創(chuàng)建一個Product各個部件的操作
ConcreteBuilder:具體的生成器的實現(xiàn)類
Product:產(chǎn)品,表示被生成器構(gòu)建的復雜的對象杀狡,包含多個部件
Director:指導者也稱導向者,主要用來使用Builder接口 ,已一個統(tǒng)一的接口創(chuàng)建Product對象

比如我們要生產(chǎn)一輛汽車, 簡單分為生產(chǎn)發(fā)動機, 輪子, 車門, 分別由發(fā)動機部門, 輪子部門, 車門部門分別負責生產(chǎn)
由生產(chǎn)調(diào)度中心調(diào)度, 并將3個部門的產(chǎn)品合成為一輛汽車

首先我們創(chuàng)建一個生產(chǎn)調(diào)度中心Build類負責調(diào)度其他生產(chǎn)部門, 這個時候需要給生產(chǎn)部門一個約束或者是協(xié)議, 比如部門要有統(tǒng)一的生產(chǎn)方法
然后我們以接口的形式創(chuàng)建各個部門的抽象接口
AbstractEngineProtocol.h

#import <Foundation/Foundation.h>
#import <UIKit/UIkit.h>

@protocol AbstractEngineProtocol <NSObject>

@required

/**
 設置發(fā)動機尺寸

 @param scale 尺寸大小
 */
- (void)engineScale:(CGFloat)scale;

/**
 設置發(fā)動機重量

 @param height 發(fā)動機重量
 */
- (void)engineWeight:(CGFloat)height;

/**
 獲取發(fā)動機信息

 @return 返回發(fā)動機信息
 */
- (NSString *)information;

@end

AbstractWheelProtocol.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@protocol AbstractWheelProtocol <NSObject>

@required

/**
 設置輪子個數(shù)

 @param number 個數(shù)
 */
- (void)wheelNumber:(CGFloat)number;

/**
 返回輪子信息

 @return 輪子信息
 */
- (NSString *)information;

@end

AbstractDoorProtocol.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@protocol AbstractDoorProtocol <NSObject>

@required

/**
 設置門的數(shù)量

 @param number 數(shù)量
 */
- (void)doorNumber:(CGFloat)number;

/**
 返回車門的信息

 @return 車門信息
 */
- (NSString *)information;

@end

BuildProtocal.h

#import <Foundation/Foundation.h>

@protocol BuildProtocal <NSObject>

@required

/**
 生產(chǎn)部件

 @return 返回部件
 */
- (id)build;

@end

Builder.h

#import <Foundation/Foundation.h>
#import "AbstractDoorProtocol.h"
#import "AbstractWheelProtocol.h"
#import "AbstractEngineProtocol.h"
#import "BuildProtocal.h"

@interface Builder : NSObject

@property (nonatomic, strong) id <BuildProtocal, AbstractEngineProtocol> engine;
@property (nonatomic, strong) id <BuildProtocal, AbstractWheelProtocol> wheel;
@property (nonatomic, strong) id <BuildProtocal, AbstractDoorProtocol> door;

/**
 產(chǎn)品信息
 */
@property (nonatomic, strong) NSDictionary *productInfo;

/**
 構(gòu)建所有部件

 @return 返回產(chǎn)品
 */
- (id)buildAllParts;

@end

Builder.m

#import "Builder.h"

@implementation Builder

- (id)buildAllParts {
    
    //創(chuàng)建部件
    [self.engine build];
    [self.wheel build];
    [self.door build];
    
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    
    //組裝產(chǎn)品
    dict[@"engine"] = [self.engine information];
    dict[@"wheel"]  = [self.wheel information];
    dict[@"door"]   = [self.door information];
    
    self.productInfo = dict;
    
    return self;
}

@end

接下來我們創(chuàng)建各個部門的類, 他們實現(xiàn)部門抽象接口的同時還要遵循調(diào)度中心的約束, 實現(xiàn)調(diào)度中心的接口

BMWEngine.h

#import <Foundation/Foundation.h>
#import "AbstractEngineProtocol.h"
#import "BuildProtocal.h"

@interface BMWEngine : NSObject <AbstractEngineProtocol, BuildProtocal>


@end

BMWEngine.m

#import "BMWEngine.h"

@implementation BMWEngine

#pragma mark - AbstractEngineProtocol methods

- (void)engineScale:(CGFloat)scale {
    
    //to do
}

- (void)engineWeight:(CGFloat)height {
    
    //to do
}

- (NSString *)information {
    
    return @"BMW Engine, Scale: 10, Height: 100kg";
}

#pragma mark - BuildProtocol method

- (id)build {
    
    return [BMWEngine new];
}

@end

MIQIWheel.h

#import <Foundation/Foundation.h>
#import "BuildProtocal.h"
#import "AbstractWheelProtocol.h"

@interface MIQIWheel : NSObject <BuildProtocal, AbstractWheelProtocol>

@end

MIQIWheel.m

#import "MIQIWheel.h"

@implementation MIQIWheel

#pragma mark - AbstractWheelProtocol methods

- (void)wheelNumber:(CGFloat)number {
    
    //to do
}

- (NSString *)information {
    
    return @"MIQI Wheel, number: 4";
}

#pragma mark - BuildProtocol method


- (id)build {
        
    return [MIQIWheel new];
}

@end

BMWDoor.h

#import <Foundation/Foundation.h>
#import "BuildProtocal.h"
#import "AbstractDoorProtocol.h"

@interface BMWDoor : NSObject <BuildProtocal, AbstractDoorProtocol>

@end

BMWDoor.m

#import "BMWDoor.h"

@implementation BMWDoor

#pragma mark - AbstractDoorProtocol methods

- (void)doorNumber:(CGFloat)number {
    
    //to do
}

- (NSString *)information {
    
    return @"BMW Door, number: 4";
}

#pragma mark - BuildProtocol method

- (id)build {
    
    return [BMWDoor new];
}

@end

下面是在Controller中實現(xiàn)

#import "ViewController.h"
#import "Builder.h"
#import "BMWEngine.h"
#import "BMWDoor.h"
#import "MIQIWheel.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    
    [super viewDidLoad];
    
    //創(chuàng)建一個建造調(diào)控中心
    Builder *builder = [[Builder alloc] init];
    
    //配置生產(chǎn)組件單位
    builder.engine = [[BMWEngine alloc] init];
    builder.wheel  = [[MIQIWheel alloc] init];
    builder.door   = [[BMWDoor alloc] init];
    
    //生產(chǎn)
    id product = [builder buildAllParts];
    
    //打印產(chǎn)品信息
    NSLog(@"%@", [product productInfo]);
}


@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末轩缤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贩绕,更是在濱河造成了極大的恐慌火的,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淑倾,死亡現(xiàn)場離奇詭異馏鹤,居然都是意外死亡,警方通過查閱死者的電腦和手機娇哆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門湃累,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碍讨,你說我怎么就攤上這事治力。” “怎么了垄开?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵琴许,是天一觀的道長。 經(jīng)常有香客問我溉躲,道長榜田,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任锻梳,我火速辦了婚禮箭券,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疑枯。我一直安慰自己辩块,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布荆永。 她就那樣靜靜地躺著废亭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪具钥。 梳的紋絲不亂的頭發(fā)上豆村,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音骂删,去河邊找鬼掌动。 笑死四啰,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的粗恢。 我是一名探鬼主播柑晒,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼眷射!你這毒婦竟也來了匙赞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凭迹,失蹤者是張志新(化名)和其女友劉穎罚屋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗅绸,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡脾猛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鱼鸠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猛拴。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚀狰,靈堂內(nèi)的尸體忽然破棺而出愉昆,到底是詐尸還是另有隱情,我是刑警寧澤麻蹋,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布跛溉,位于F島的核電站,受9級特大地震影響扮授,放射性物質(zhì)發(fā)生泄漏芳室。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一刹勃、第九天 我趴在偏房一處隱蔽的房頂上張望堪侯。 院中可真熱鬧,春花似錦荔仁、人聲如沸伍宦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽次洼。三九已至,卻和暖如春遇骑,著一層夾襖步出監(jiān)牢的瞬間滓玖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工质蕉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留势篡,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓模暗,卻偏偏與公主長得像禁悠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子兑宇,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1 場景問題# 1.1 繼續(xù)導出數(shù)據(jù)的應用框架## 在討論工廠方法模式的時候碍侦,提到了一個導出數(shù)據(jù)的應用框架。 對于...
    七寸知架構(gòu)閱讀 5,743評論 1 64
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理隶糕,服務發(fā)現(xiàn)瓷产,斷路器,智...
    卡卡羅2017閱讀 134,660評論 18 139
  • 場景舉個簡單的例子枚驻,拿魔獸世界來說(作者沒玩過濒旦,哪里說得不對請多多見諒,能明白意思就好)里面的角色分成許多種族:人...
    俊月閱讀 1,089評論 1 2
  • 場景 舉個簡單的例子再登,拿魔獸世界來說(作者沒玩過尔邓,哪里說得不對請多多見諒,能明白意思就好) 里面的角色分成許多種族...
    sqatm閱讀 984評論 4 10
  • 初夏的雨淅淅瀝瀝落了兩三天锉矢,天氣倒也涼爽梯嗽,這樣的天睡個懶覺是多么愜意」了穑可惜灯节,已經(jīng)幾年連整覺都沒睡過,更何談懶覺绵估,都...
    church_的夏天閱讀 171評論 0 0