设计模式-生成器模式(建造者模式)

动机:建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。

定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。根据中文翻译的不同,建造者模式又可以称为生成器模式。

角色:

  • Builder:抽象建造者
  • ConcreteBuilder:具体建造者
  • Director:指挥者
  • Product:产品角色

实例:

生成器模式将复杂的创建逻辑进行分割. 如:生产汽车,分布安装生产不同的零部件.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// 抽象汽车类
@interface Car : NSObject

@end

// 抽象汽车生成器
@interface CarBuilder : NSObject

- (void)createNewCar;
- (Car *)getCar;
// 建造过程
- (void)buildWheels;
- (void)buildEngine;
- (void)buildBody;

@end

@implementation CarBuilder
{
Car *_car;
}

- (void)createNewCar
{
_car = [Car new];
}

- (Car *)getCar
{
return _car;
}

@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 大众车生成器
@interface VolkswagenCarBuilder : CarBuilder
@end

@implementation VolkswagenCarBuilder
// 实现基类中的三个方法,配置大众车应该有的轮子机器和车身
@end

// 奔驰车生成器
@interface BenzCarBuilder : CarBuilder
@end

@implementation BenzCarBuilder
// 实现基类中的三个方法,配置奔驰车应该有的轮子机器和车身
@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// 生产商
@interface Productor : NSObject

- (void)setCarBuilder:(CarBuilder *)carBuilder;
- (void)constructCar;
- (Car *)getCar;

@end

@implementation Productor
{
CarBuilder *_carBuilder;
}

- (void)setCarBuilder:(CarBuilder *)carBuilder
{
_carBuilder = carBuilder;
}

- (void)constructCar
{
[_carBuilder createNewCar];
[_carBuilder buildWhells];
[_carBuilder buildEngine];
[_carBuilder buildBody];
}

- (Car *)getCar
{
return [_carBuilder getCar];
}

@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 顾客
@interface Customer : NSObject

@end

@implementation Customer

- (void)buyCar
{
Productor *productor = [Productor new];
BenzeCarBuilder *builder = [BenzeCarBuilder new];
[productor setCarBuilder:builder];
[productor constructCar];
// 获得了一个复杂的车
Car *car = [productor getCar];
}

@end

上述例子对的角色分别是:

抽象建造者(Builder) 具体建造者(ConcreteBuilder) 指挥者(Product) 产品角色(Product)
CarBuilder VolkswagenCarBuilder&BenzCarBuilder Productor Car

对应的结构图如下:

优点:

  • 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
  • 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同的产品对象 。
  • 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”。
  • 可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。

缺点:

  • 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制
  • 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

总结:

结合业务场景斟酌使用