建造者模式(Builder)(生成器)

一個蘿蔔壹個坑發表於2017-12-22

基本概念

建造者模式,將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

建造者模式(Builder)(生成器)

建造者主要是用來建立一些複雜的物件,這些物件內部構造間的建造順序通常是穩定,但是物件內部的構造通常是面臨著複雜的變化。

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

相關文章