基本概念
建造者模式竹挡,將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示奖蔓。
建造者主要是用來創(chuàng)建一些復(fù)雜的對象赞草,這些對象內(nèi)部構(gòu)造間的建造順序通常是穩(wěn)定,但是對象內(nèi)部的構(gòu)造通常是面臨著復(fù)雜的變化吆鹤。
1 Builder:為創(chuàng)建一個產(chǎn)品對象的各個部件指定抽象接口厨疙。
2 ConcreteBuilder:實現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個部件,定義并明確它所創(chuàng)建的表示疑务,并 提供一個檢索產(chǎn)品的接口沾凄。
3 Director:構(gòu)造一個使用Builder接口的對象梗醇。
4 Product:表示被構(gòu)造的復(fù)雜對象。ConcreteBuilder創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過程撒蟀,包含定義組成部件的類叙谨,包括將這些部件裝配成最終產(chǎn)品的接口。
Product,一種產(chǎn)品保屯,它具有多個復(fù)雜的部件
@interface Product : NSObject
@property (nonatomic, strong)NSMutableArray *partArray;// 部件數(shù)組
- (void)addPart:(NSString *)partString;// 添加部件
- (void)show;// 展示所有部件
@end
#import "Product.h"
@implementation Product
- (instancetype)init
{
self = [super init];
if (self) {
self.partArray = [NSMutableArray array];
}
return self;
}
- (void)addPart:(NSString *)partString
{
[self.partArray addObject:partString];
}
- (void)show
{
NSLog(@"產(chǎn)品創(chuàng)建----");
for (NSString *part in self.partArray) {
NSLog(@"%@",part);
}
}
@end
Builder:抽象的建造類手负,他將產(chǎn)品Product 分為兩個建造過程PartA和PartB,并得到最終的產(chǎn)品getResult
@interface Builder : NSObject
@property (nonatomic, strong)Product *product;
- (void)buildPartA;
- (void)buildPartB;
- (Product *)getResult;
@end
建造類1:產(chǎn)品的第一種建造工藝
@implementation ConcreteBuilder1
- (instancetype)init
{
self = [super init];
if (self) {
self.product = [[Product alloc] init];
}
return self;
}
- (void)buildPartA
{
[self.product addPart:@"Part A"];
}
- (void)buildPartB
{
[self.product addPart:@"Part B"];
}
- (Product *)getResult
{
return self.product;
}
@end
建造類2:產(chǎn)品的第二種建造工藝
#import "ConcreteBuilder2.h"
@implementation ConcreteBuilder2
- (instancetype)init
{
self = [super init];
if (self) {
self.product = [[Product alloc] init];
}
return self;
}
- (void)buildPartA
{
[self.product addPart:@"部件 1"];
}
- (void)buildPartB
{
[self.product addPart:@"部件 2"];
}
- (Product *)getResult
{
return self.product;
}
@end
Director類:指揮類姑尺,要求產(chǎn)品是第一種建造工藝還是第二種建造工藝
@interface Director : NSObject
- (void)constructWithBuilder:(Builder *)builder;
@end
#import "Director.h"
@implementation Director
- (instancetype)init
{
self = [super init];
if (self) {
}
return self;
}
- (void)constructWithBuilder:(Builder *)builder
{
[builder buildPartA];
[builder buildPartB];
}
@end
客戶端實現(xiàn):
(1)第一種工藝
Director *director = [[Director alloc]init];// 創(chuàng)建指揮者
Builder *b1 = [[ConcreteBuilder1 alloc] init];
[director constructWithBuilder:b1];
Product *p1 = [b1 getResult];
[p1 show];
輸出結(jié)果
2017-04-17 17:08:01.488 簡單工廠——01[41833:300289] 產(chǎn)品創(chuàng)建----
2017-04-17 17:08:01.488 簡單工廠——01[41833:300289] Part A
2017-04-17 17:08:01.488 簡單工廠——01[41833:300289] Part B
(2)第二種工藝
Director *director = [[Director alloc]init];// 創(chuàng)建指揮者
Builder *b2 = [[ConcreteBuilder2 alloc] init];
[director constructWithBuilder:b2];
Product *p2 = [b2 getResult];
[p2 show];
輸出結(jié)果
2017-04-17 17:22:28.405 簡單工廠——01[42029:310980] 產(chǎn)品創(chuàng)建----
2017-04-17 17:22:28.405 簡單工廠——01[42029:310980] 部件 1
2017-04-17 17:22:28.405 簡單工廠——01[42029:310980] 部件 2