基本概念
建造者模式,將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
建造者主要是用來建立一些複雜的物件,這些物件內部構造間的建造順序通常是穩定,但是物件內部的構造通常是面臨著複雜的變化。
1 Builder:為建立一個產品物件的各個部件指定抽象介面。
2 ConcreteBuilder:實現Builder的介面以構造和裝配該產品的各個部件,定義並明確它所建立的表示,並 提供一個檢索產品的介面。
3 Director:構造一個使用Builder介面的物件。
4 Product:表示被構造的複雜物件。ConcreteBuilder建立該產品的內部表示並定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產品的介面。
Product,一種產品,它具有多個複雜的部件
@interface Product : NSObject
@property (nonatomic, strong)NSMutableArray *partArray;// 部件陣列
- (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(@"產品建立----");
for (NSString *part in self.partArray) {
NSLog(@"%@",part);
}
}
@end
Builder:抽象的建造類,他將產品Product 分為兩個建造過程PartA和PartB,並得到最終的產品getResult
@interface Builder : NSObject
@property (nonatomic, strong)Product *product;
- (void)buildPartA;
- (void)buildPartB;
- (Product *)getResult;
@end
建造類1:產品的第一種建造工藝
@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:產品的第二種建造工藝
#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類:指揮類,要求產品是第一種建造工藝還是第二種建造工藝
@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
客戶端實現:
(1)第一種工藝
Director *director = [[Director alloc]init];// 建立指揮者
Builder *b1 = [[ConcreteBuilder1 alloc] init];
[director constructWithBuilder:b1];
Product *p1 = [b1 getResult];
[p1 show];
輸出結果
2017-04-17 17:08:01.488 簡單工廠——01[41833:300289] 產品建立----
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];// 建立指揮者
Builder *b2 = [[ConcreteBuilder2 alloc] init];
[director constructWithBuilder:b2];
Product *p2 = [b2 getResult];
[p2 show];
輸出結果
2017-04-17 17:22:28.405 簡單工廠——01[42029:310980] 產品建立----
2017-04-17 17:22:28.405 簡單工廠——01[42029:310980] 部件 1
2017-04-17 17:22:28.405 簡單工廠——01[42029:310980] 部件 2