基本概念
建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者主要是用来创建一些复杂的对象,这些对象内部构造间的建造顺序通常是稳定,但是对象内部的构造通常是面临着复杂的变化。
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
网友评论