创建者模式(Builder Pattern):也叫生成器模式,它将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
适用场景
首先,我们注意上面的限定词:复杂对象
,这表示这个对象的创建过程比较繁琐,可以分为不同的小步骤创建组成部分,然后通过组合这些小步骤来完成一个完整对象的创建。所以简单的对象创建就不用使用这个模式啦。
其次,即使是复杂的对象,但是只有一种表现形式也没必要用,只有当你需要创建同一个系列(很多)的复杂对象的时候,你才有必要把构建过程和表现过程分离,分别封装起来,让你的构建过程可以复用,表现过程通过抽象定义每个步骤的方法,让子类去具体实现这些方法,是每个步骤差异化,从而构建出来不同的产品表现。客户端只需要面向接口编程即可,方便切换到不同的产品。
UML结构图
建造者模式包含4个成员:
- 抽象建造者(Builder):生成器接口,定义创建一个Product对象所需要的各个部件的操作
- 具体建造者(ConcreteBuilder):具体的生成器实现,实现各个部件的创建,并负责组装Product对象的各个部件,同时还提供一个让用户获取组装完成后的产品对象的方法
- 指挥者(Director): 主要用来使用Builder接口,以一个统一的过程来构建所需要的Product对象
- 产品角色(Product): 表示生成器构建的复杂对象,包含多个部件
我们这里就列举一个建造房子的案例
我们建造房子的过程中需要包含以下几部分
- 1、房主:房子的主人,也就是指挥者
- 2、设计图纸协议,施工队协议是抽象建造者
- 1、设计图纸:房子的图纸设计(不同的设计图纸出现不同的房子),也就是具体建造者;
- 2、具体施工队:具体到盖房子的人(不同的施工队施工效果不同),也就是具体建造者
- 3、盖好的房子:就是我们的产品角色
抽象类
- 1、设计图纸抽象类
DesignProtocol
必须实现的方法
/**
设计图纸类型
*/
- (void)DesignDrawings
- 2、施工队抽象类
ConstructionProtocol
必须实现的方法
/**
施工队 施工
*/
- (void)Construction
具体类
- 1、施工图纸
我们创建A_Design、B_Design、C_Design
分别是设计大别墅、小洋楼、茅草屋
我们以A_Design
为例,遵守协议<BuilderProtocol,DesignProtocol>
,实现协议方法
- (void)DesignDrawings{
NSLog(@"设计图纸是大别墅");
}
- (id)build{
return self;
}
- 2、施工队
我们创建A_Construction、B_Construction、C_Construction
具体施工队,分别是ABC三种等级的施工队,遵守协议<BuilderProtocol,ConstructionProtocol>
实现协议
- (void)Construction{
NSLog(@"A级施工队");
}
- (id)build{
return self;
}
抽象创建者Builder
// 设计图纸
@property (nonatomic,strong) id<DesignProtocol,BuilderProtocol> design;
// 建筑队
@property (nonatomic,strong) id<ConstructionProtocol,BuilderProtocol> construction;
/**
* 构建所有部件
*/
- (void)buildAllParts;
具体实现
/**
* 构建所有部件
*/
- (void)buildAllParts{
//创建所有部件
[self.design build];
[self.construction build];
//组装产品
[self.design DesignDrawings];
[self.construction Construction];
//出来产品
NSLog(@"造出来房子了");
}
Builder
协议
/**
* 构建对象
*
* @return 返回构建的对象
*/
- (id)build;
客户端调用
// 创建组装者
Builder *builder = [[Builder alloc] init];
//指定具体部件
builder.design = [A_Design new];
builder.construction = [B_Construction new];
// 构建所有的部件
[builder buildAllParts];
打印结果
2019-01-07 15:52:15.917483+0800 创建者模式[8420:339393] 设计图纸是大别墅
2019-01-07 15:52:15.917671+0800 创建者模式[8420:339393] B级施工队
2019-01-07 15:52:15.917682+0800 创建者模式[8420:339393] 造出来房子了
如果想要其他种结果,可以对具体部件进行不同的创建