1丁鹉、建造者模式簡(jiǎn)述
-
建造者模式
(Builder),又叫生成器模式
將一個(gè)復(fù)雜對(duì)象
的構(gòu)建與它的表示分離雳灾,使得同樣的構(gòu)建過(guò)程
可以創(chuàng)建不同的表示
; - 如果使用了建造者模式谎亩,用戶(hù)就只需要指定需要構(gòu)建的類(lèi)型,而具體的構(gòu)建細(xì)節(jié)無(wú)需知道匈庭。
2浑劳、建造者模式角色劃分
-
抽象建造者:Builder
- 為創(chuàng)建一個(gè)Product對(duì)象的各個(gè)部分指定抽象接口;
- 一般至少會(huì)有兩個(gè)抽象方法魔熏,一個(gè)用來(lái)建造產(chǎn)品,一個(gè)是用來(lái)返回產(chǎn)品蒜绽。
-
具體建造者:ConcreteBuilder
- 實(shí)現(xiàn)抽象建造者的接口,具體的去構(gòu)建各個(gè)部分鼎姊;
-
具體產(chǎn)品:Product
- 就是我們所需要的具體產(chǎn)品;
- 由多個(gè)部件組成相寇;
-
指揮者:Director
- 負(fù)責(zé)調(diào)用適當(dāng)?shù)慕ㄔ煺邅?lái)構(gòu)建我們需要的產(chǎn)品噪生;
3东囚、建造者模式UML類(lèi)圖
4、建造者模式示意代碼
-
抽象建造者:
YAbsComputerBuilder
@protocol YAbsComputerBuilder <NSObject> /** 構(gòu)建主板 */ - (void)buildMainboard; /** 構(gòu)建處理器 */ - (void)buildCPU; /** 構(gòu)建顯卡 */ - (void)buildGPU; /** 構(gòu)建內(nèi)存 */ - (void)buildMemoryDisk; /** 構(gòu)建硬盤(pán) */ - (void)buildHardDisk; /** 構(gòu)建顯示器 */ - (void)buildDisplay; /** 獲取構(gòu)建好的具體產(chǎn)品 */ - (YComputer *)getBuidResult; @end
-
具體建造者:ConcreteBuilder
-
普通電腦建造者:
YNormalComputerBuilder
@implementation YNormalComputerBuilder { YComputer *_computer; } - (instancetype)init { if (self = [super init]) { _computer = [[YComputer alloc] init]; } return self; } /** 構(gòu)建主板 */ - (void)buildMainboard { _computer.mainboard = @"技嘉 H110M-DS2V主板"; } /** 構(gòu)建處理器 */ - (void)buildCPU { _computer.cpu = @"intel i3處理器"; } /** 構(gòu)建顯卡 */ - (void)buildGPU { _computer.gpu = @"集成顯卡"; } /** 構(gòu)建內(nèi)存 */ - (void)buildMemoryDisk { _computer.memoryDisk = @"金士頓 4G內(nèi)存"; } /** 構(gòu)建硬盤(pán) */ - (void)buildHardDisk { _computer.hardDisk = @"500G 機(jī)械硬盤(pán)"; } /** 構(gòu)建顯示器 */ - (void)buildDisplay { _computer.display = @"13存 2K顯示器"; } - (YComputer *)getBuidResult { return _computer; }
-
高配電腦建造者:
YAdvancedComputerBuilder
@implementation YAdvancedComputerBuilder { YComputer *_computer; } - (instancetype)init { if (self = [super init]) { _computer = [[YComputer alloc] init]; } return self; } /** 構(gòu)建主板 */ - (void)buildMainboard { _computer.mainboard = @"技嘉 X299 UD4主板"; } /** 構(gòu)建處理器 */ - (void)buildCPU { _computer.cpu = @"intel i9處理器"; } /** 構(gòu)建顯卡 */ - (void)buildGPU { _computer.gpu = @"GTX1080顯卡"; } /** 構(gòu)建內(nèi)存 */ - (void)buildMemoryDisk { _computer.memoryDisk = @"金士頓 16G內(nèi)存"; } /** 構(gòu)建硬盤(pán) */ - (void)buildHardDisk { _computer.hardDisk = @"1T 固態(tài)硬盤(pán)"; } /** 構(gòu)建顯示器 */ - (void)buildDisplay { _computer.display = @"27存 4K顯示器"; } - (YComputer *)getBuidResult { return _computer; }
-
-
具體產(chǎn)品:
YComputer
@interface YComputer : NSObject @property (nonatomic, copy)NSString *mainboard; //!< 主板 @property (nonatomic, copy)NSString *cpu; //!< 處理器 @property (nonatomic, copy)NSString *gpu; //!< 顯卡 @property (nonatomic, copy)NSString *memoryDisk; //!< 內(nèi)存 @property (nonatomic, copy)NSString *hardDisk; //!< 硬盤(pán) @property (nonatomic, copy)NSString *display; //!< 顯示器 /** 用于展示商品 */ - (void)show; @end
@implementation YComputer - (void)show { NSLog(@"<<<<電腦的配置單>>>>"); NSLog(@"主板: %@", self.mainboard); NSLog(@"CPU: %@", self.cpu); NSLog(@"GPU: %@", self.gpu); NSLog(@"內(nèi)存: %@", self.memoryDisk); NSLog(@"硬盤(pán): %@", self.hardDisk); NSLog(@"顯示器: %@\n", self.display); } @end
-
指揮者:
YComputerDirector
@interface YComputerDirector : NSObject - (void)constructWithBuilder:(id <YAbsComputerBuilder>)builder; @end
-
Client
// 指揮者 YComputerDirector *director = [[YComputerDirector alloc] init]; // 建造者 YNormalComputerBuilder *normalBuilder = [[YNormalComputerBuilder alloc] init]; YAdvancedComputerBuilder *advBuilder = [[YAdvancedComputerBuilder alloc] init]; // <普通電腦>裝配、構(gòu)建 [director constructWithBuilder:normalBuilder]; // 具體產(chǎn)品 YComputer *normalComputer = [normalBuilder getBuidResult]; // 展示產(chǎn)品 [normalComputer show]; // <高配電腦>裝配份帐、構(gòu)建 [director constructWithBuilder:advBuilder]; // 具體產(chǎn)品 YComputer *advComputer = [advBuilder getBuidResult]; // 展示產(chǎn)品 [advComputer show]; // 運(yùn)行結(jié)果: <<<<電腦配置單>>>> 主板: 技嘉 H110M-DS2V主板 CPU: intel i3處理器 GPU: 集成顯卡 內(nèi)存: 金士頓 4G內(nèi)存 硬盤(pán): 500G 機(jī)械硬盤(pán) 顯示器: 13存 2K顯示器 <<<<電腦配置單>>>> 主板: 技嘉 X299 UD4主板 CPU: intel i9處理器 GPU: GTX1080顯卡 內(nèi)存: 金士頓 16G內(nèi)存 硬盤(pán): 1T 固態(tài)硬盤(pán) 顯示器: 27存 4K顯示器
5、建造者模式總結(jié)
-
優(yōu)點(diǎn):
- 使用建造者模式可以使客戶(hù)端不必知道產(chǎn)品內(nèi)部的構(gòu)建細(xì)節(jié)畜挨;
- Builder之間是相互獨(dú)立的筒繁,與其它的Builder無(wú)關(guān)巴元,便于系統(tǒng)的擴(kuò)展;
-
與
工廠模式
的區(qū)別:建造者模式比工廠模式多了一個(gè)指揮者(Direcitor)角色逮刨;
-
意圖不同:
- 工廠模式:關(guān)注的是產(chǎn)品整體;我們需要什么產(chǎn)品恢总,共產(chǎn)就給我我們什么產(chǎn)品;
- 建造者模式:關(guān)注的是產(chǎn)品組成部分的構(gòu)建過(guò)程片仿;將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示滋戳,而調(diào)用者不需要知道這些細(xì)節(jié);
-
產(chǎn)品復(fù)雜度不同:
- 工廠模式:一般都是單一性質(zhì)產(chǎn)品奸鸯;
- 建造者模式:復(fù)合型產(chǎn)品;它由各個(gè)部件組合而成娄涩,部件不同造成的產(chǎn)品也截然不同;