动机:建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。
定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。根据中文翻译的不同,建造者模式又可以称为生成器模式。
角色:
- 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 |
对应的结构图如下:
优点:
- 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
- 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同的产品对象 。
- 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”。
- 可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
缺点:
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
总结:
结合业务场景斟酌使用