定義
將一個復(fù)雜對象的構(gòu)建與它的表示分離握牧,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示
主要作用
在用戶不知道對象的建造過程和細(xì)節(jié)的情況下就可以直接創(chuàng)建復(fù)雜的對象。
1. 用戶只需要給出指定復(fù)雜對象的類型和內(nèi)容相速;
2. 建造者模式負(fù)責(zé)按順序創(chuàng)建復(fù)雜對象(把內(nèi)部的建造過程和細(xì)節(jié)隱藏起來)
解決問題
方便用戶創(chuàng)建復(fù)雜的對象(不需要知道實現(xiàn)過程)
代碼復(fù)用性 & 封裝性(將對象構(gòu)建過程和細(xì)節(jié)進(jìn)行封裝 & 復(fù)用)
角色
- Builder:給出一個抽象接口,以規(guī)范產(chǎn)品對象的各個組成成分的建造鲜锚。這個接口規(guī)定要實現(xiàn)復(fù)雜對象的哪些部分的創(chuàng)建突诬,并不涉及具體的對象部件的創(chuàng)建苫拍。
- ConcreteBuilder:實現(xiàn)Builder接口,針對不同的商業(yè)邏輯旺隙,具體化復(fù)雜對象的各部分的創(chuàng)建绒极。 在建造過程完成后,提供產(chǎn)品的實例蔬捷。
- Director:調(diào)用具體建造者來創(chuàng)建復(fù)雜對象的各個部分垄提,在指導(dǎo)者中不涉及具體產(chǎn)品的信息,只負(fù)責(zé)保證對象各部分完整創(chuàng)建或按某種順序創(chuàng)建周拐。
- Product:要創(chuàng)建的復(fù)雜對象塔淤。
場景模擬
我們都知道汽車都是有方向盤,輪子速妖,發(fā)動機(jī)等組成的高蜂。今天小明到了4s店想買一輛汽車,向店老板說了大眾的方向盤罕容,大眾的輪子备恤,大眾的發(fā)動機(jī)。
建造者模型UML圖
image.png
代碼
@interface Car : NSObject
@property (nonatomic,strong) NSString *tire;
@property (nonatomic,strong) NSString * wheel;
@property (nonatomic,strong) NSString * engine;
@end
#import "Car.h"
@implementation Car
-(NSString *)description{
NSLog(@"輪胎:%@ 方形盤:%@锦秒,引擎:%@",self.tire,self.wheel,self.engine);
return nil;
}
@end
#import "Car.h"
@protocol Carbuilder <NSObject>
-(void)tire;
-(void)engine;
-(void)wheel;
-(Car*)createCar;
@end
#import "Carbuilder.h"
@interface DZCarBuilder : NSObject<Carbuilder>
@end
#import "DZCarBuilder.h"
@interface DZCarBuilder()
@property (nonatomic,strong) Car *car;
@end
@implementation DZCarBuilder
- (instancetype)init
{
self = [super init];
if (self) {
self.car = [Car new];
}
return self;
}
-(void)tire{
self.car.tire =@"大眾的輪胎";
}
-(void)wheel{
self.car.wheel = @"大眾的方向盤";
}
-(void)engine
{
self.car.engine=@"大眾的引擎";
}
-(Car *)createCar{
return self.car;
}
@end
#import <Foundation/Foundation.h>
#import "Carbuilder.h"
@interface Director : NSObject
-(Car *)createCar:(id<Carbuilder>)carBuider;
@end
#import "Director.h"
@implementation Director
-(Car *)createCar:(id<Carbuilder>)carBuider
{
[carBuider tire];
[carBuider wheel];
[carBuider engine];
return [carBuider createCar];
}
@end
測試代碼
id <Carbuilder> builder= [DZCarBuilder new];
Director * director = [Director new];
Car *car = [director createCar:builder];
[car description];
測試結(jié)果
[20011:7006293] 輪胎:大眾的輪胎 方形盤:大眾的方向盤露泊,引擎:大眾的引擎
- 協(xié)議Carbuilder 代表的是Builder
- DZCarBuilder 具體是實現(xiàn)類(ConcreteBuilder)
- Director就是 Director
- Car 代表Product 類
我們想生產(chǎn)不同的車就實現(xiàn)不同的Carbuilder 就可以了。
應(yīng)用場景
建造者模式主要解決在軟件系統(tǒng)中旅择,有時候面臨著"一個復(fù)雜對象"的創(chuàng)建工作惭笑,其通常由各個部分的子對象用一定的算法構(gòu)成;由于需求的變化生真,這個復(fù)雜對象的各個部分經(jīng)常面臨著劇烈的變化沉噩,但是將它們組合在一起的算法卻相對穩(wěn)定。
優(yōu)缺點
優(yōu)點
- 易于解耦
將產(chǎn)品本身與產(chǎn)品創(chuàng)建過程進(jìn)行解耦柱蟀,可以使用相同的創(chuàng)建過程來得到不同的產(chǎn)品川蒙。也就說細(xì)節(jié)依賴抽象。(依賴倒置原則)
- 易于精確控制對象的創(chuàng)建
將復(fù)雜產(chǎn)品的創(chuàng)建步驟分解在不同的方法中长已,使得創(chuàng)建過程更加清晰
- 易于拓展
增加新的具體建造者無需修改原有類庫的代碼畜眨,易于拓展,符合“開閉原則“术瓮。
每一個具體建造者都相對獨立康聂,而與其他的具體建造者無關(guān),因此可以很方便地替換具體建造者或增加新的具體建造者胞四,用戶使用不同的具體建造者即可得到不同的產(chǎn)品對象恬汁。
缺點
- 建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點,其組成部分相似撬讽;如果產(chǎn)品之間的差異性很大蕊连,則不適合使用建造者模式悬垃,因此其使用范圍受到一定的限制。
- 如果產(chǎn)品的內(nèi)部變化復(fù)雜甘苍,可能會導(dǎo)致需要定義很多具體建造者類來實現(xiàn)這種變化尝蠕,導(dǎo)致系統(tǒng)變得很龐大
具體代碼在demo中
下一篇博客地址
結(jié)構(gòu)性設(shè)計模式-適配器模式