1.生成器模式的定义
将一个复杂的对象的构件与它的表示分离,使得同样的构建过程可以创建不同的表示
2.生成器模式的UML
Builder :生成器接口,定义创建一个Product各个部件的操作 ConcreteBuilder:具体的生成器的实现类 Product:产品,表示被生成器构建的复杂的对象,包含多个部件 Director:指导者也称导向者,主要用来使用Builder接口 ,已一个统一的接口创建Product对象
比如我们要生产一辆汽车, 简单分为生产发动机, 轮子, 车门, 分别由发动机部门, 轮子部门, 车门部门分别负责生产
由生产调度中心调度, 并将3个部门的产品合成为一辆汽车
首先我们创建一个生产调度中心Build类负责调度其他生产部门, 这个时候需要给生产部门一个约束或者是协议, 比如部门要有统一的生产方法
然后我们以接口的形式创建各个部门的抽象接口
AbstractEngineProtocol.h
代码语言:javascript复制 1 #import <Foundation/Foundation.h>
2 #import <UIKit/UIkit.h>
3
4 @protocol AbstractEngineProtocol <NSObject>
5
6 @required
7
8 /**
9 设置发动机尺寸
10
11 @param scale 尺寸大小
12 */
13 - (void)engineScale:(CGFloat)scale;
14
15 /**
16 设置发动机重量
17
18 @param height 发动机重量
19 */
20 - (void)engineWeight:(CGFloat)height;
21
22 /**
23 获取发动机信息
24
25 @return 返回发动机信息
26 */
27 - (NSString *)information;
28
29 @end
AbstractWheelProtocol.h
代码语言:javascript复制 1 #import <Foundation/Foundation.h>
2 #import <UIKit/UIKit.h>
3
4 @protocol AbstractWheelProtocol <NSObject>
5
6 @required
7
8 /**
9 设置轮子个数
10
11 @param number 个数
12 */
13 - (void)wheelNumber:(CGFloat)number;
14
15 /**
16 返回轮子信息
17
18 @return 轮子信息
19 */
20 - (NSString *)information;
21
22 @end
AbstractDoorProtocol.h
代码语言:javascript复制 1 #import <Foundation/Foundation.h>
2 #import <UIKit/UIKit.h>
3
4 @protocol AbstractDoorProtocol <NSObject>
5
6 @required
7
8 /**
9 设置门的数量
10
11 @param number 数量
12 */
13 - (void)doorNumber:(CGFloat)number;
14
15 /**
16 返回车门的信息
17
18 @return 车门信息
19 */
20 - (NSString *)information;
21
22 @end
BuildProtocal.h
代码语言:javascript复制 1 #import <Foundation/Foundation.h>
2
3 @protocol BuildProtocal <NSObject>
4
5 @required
6
7 /**
8 生产部件
9
10 @return 返回部件
11 */
12 - (id)build;
13
14 @end
Builder.h
代码语言:javascript复制 1 #import <Foundation/Foundation.h>
2 #import "AbstractDoorProtocol.h"
3 #import "AbstractWheelProtocol.h"
4 #import "AbstractEngineProtocol.h"
5 #import "BuildProtocal.h"
6
7 @interface Builder : NSObject
8
9 @property (nonatomic, strong) id <BuildProtocal, AbstractEngineProtocol> engine;
10 @property (nonatomic, strong) id <BuildProtocal, AbstractWheelProtocol> wheel;
11 @property (nonatomic, strong) id <BuildProtocal, AbstractDoorProtocol> door;
12
13 /**
14 产品信息
15 */
16 @property (nonatomic, strong) NSDictionary *productInfo;
17
18 /**
19 构建所有部件
20
21 @return 返回产品
22 */
23 - (id)buildAllParts;
24
25 @end
Builder.m
代码语言:javascript复制 1 #import "Builder.h"
2
3 @implementation Builder
4
5 - (id)buildAllParts {
6
7 //创建部件
8 [self.engine build];
9 [self.wheel build];
10 [self.door build];
11
12 NSMutableDictionary *dict = [NSMutableDictionary dictionary];
13
14 //组装产品
15 dict[@"engine"] = [self.engine information];
16 dict[@"wheel"] = [self.wheel information];
17 dict[@"door"] = [self.door information];
18
19 self.productInfo = dict;
20
21 return self;
22 }
23
24 @end
接下来我们创建各个部门的类, 他们实现部门抽象接口的同时还要遵循调度中心的约束, 实现调度中心的接口
BMWEngine.h
代码语言:javascript复制1 #import <Foundation/Foundation.h>
2 #import "AbstractEngineProtocol.h"
3 #import "BuildProtocal.h"
4
5 @interface BMWEngine : NSObject <AbstractEngineProtocol, BuildProtocal>
6
7
8 @end
BMWEngine.m
代码语言:javascript复制#import "BMWEngine.h"
@implementation BMWEngine
#pragma mark - AbstractEngineProtocol methods
- (void)engineScale:(CGFloat)scale {
//to do
}
- (void)engineWeight:(CGFloat)height {
//to do
}
- (NSString *)information {
return @"BMW Engine, Scale: 10, Height: 100kg";
}
#pragma mark - BuildProtocol method
- (id)build {
return [BMWEngine new];
}
@end
MIQIWheel.h
代码语言:javascript复制1 #import <Foundation/Foundation.h>
2 #import "BuildProtocal.h"
3 #import "AbstractWheelProtocol.h"
4
5 @interface MIQIWheel : NSObject <BuildProtocal, AbstractWheelProtocol>
6
7 @end
MIQIWheel.m
代码语言:javascript复制 1 #import "MIQIWheel.h"
2
3 @implementation MIQIWheel
4
5 #pragma mark - AbstractWheelProtocol methods
6
7 - (void)wheelNumber:(CGFloat)number {
8
9 //to do
10 }
11
12 - (NSString *)information {
13
14 return @"MIQI Wheel, number: 4";
15 }
16
17 #pragma mark - BuildProtocol method
18
19
20 - (id)build {
21
22 return [MIQIWheel new];
23 }
24
25 @end
BMWDoor.h
代码语言:javascript复制1 #import <Foundation/Foundation.h>
2 #import "BuildProtocal.h"
3 #import "AbstractDoorProtocol.h"
4
5 @interface BMWDoor : NSObject <BuildProtocal, AbstractDoorProtocol>
6
7 @end
BMWDoor.m
代码语言:javascript复制 1 #import "BMWDoor.h"
2
3 @implementation BMWDoor
4
5 #pragma mark - AbstractDoorProtocol methods
6
7 - (void)doorNumber:(CGFloat)number {
8
9 //to do
10 }
11
12 - (NSString *)information {
13
14 return @"BMW Door, number: 4";
15 }
16
17 #pragma mark - BuildProtocol method
18
19 - (id)build {
20
21 return [BMWDoor new];
22 }
23
24 @end
下面是在Controller中实现
代码语言:javascript复制 1 #import "ViewController.h"
2 #import "Builder.h"
3 #import "BMWEngine.h"
4 #import "BMWDoor.h"
5 #import "MIQIWheel.h"
6
7 @interface ViewController ()
8
9 @end
10
11 @implementation ViewController
12
13 - (void)viewDidLoad {
14
15 [super viewDidLoad];
16
17 //创建一个建造调控中心
18 Builder *builder = [[Builder alloc] init];
19
20 //配置生产组件单位
21 builder.engine = [[BMWEngine alloc] init];
22 builder.wheel = [[MIQIWheel alloc] init];
23 builder.door = [[BMWDoor alloc] init];
24
25 //生产
26 id product = [builder buildAllParts];
27
28 //打印产品信息
29 NSLog(@"%@", [product productInfo]);
30 }
31
32
33 @end