Skip to content

Latest commit

 

History

History
172 lines (114 loc) · 4.43 KB

建造者模式.md

File metadata and controls

172 lines (114 loc) · 4.43 KB

创建者模式

创建者模式(Builder Pattern):也叫生成器模式,它将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

适用场景

首先,我们注意上面的限定词:复杂对象,这表示这个对象的创建过程比较繁琐,可以分为不同的小步骤创建组成部分,然后通过组合这些小步骤来完成一个完整对象的创建。所以简单的对象创建就不用使用这个模式啦。

其次,即使是复杂的对象,但是只有一种表现形式也没必要用,只有当你需要创建同一个系列(很多)的复杂对象的时候,你才有必要把构建过程和表现过程分离,分别封装起来,让你的构建过程可以复用,表现过程通过抽象定义每个步骤的方法,让子类去具体实现这些方法,是每个步骤差异化,从而构建出来不同的产品表现。客户端只需要面向接口编程即可,方便切换到不同的产品。

UML结构图

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] 造出来房子了

如果想要其他种结果,可以对具体部件进行不同的创建