定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
主要作用
在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。
1. 用户只需要给出指定复杂对象的类型和内容;
2. 建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)
解决问题
方便用户创建复杂的对象(不需要知道实现过程)
代码复用性 & 封装性(将对象构建过程和细节进行封装 & 复用)
角色
- Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
- ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
- Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
- Product:要创建的复杂对象。
场景模拟
我们都知道汽车都是有方向盘,轮子,发动机等组成的。今天小明到了4s店想买一辆汽车,向店老板说了大众的方向盘,大众的轮子,大众的发动机。
建造者模型UML图
image.png代码
@interface Car : NSObject
@property (nonatomic,strong) NSString *tire;
@property (nonatomic,strong) NSString * wheel;
@property (nonatomic,strong) NSString * engine;
@end
#import "Car.h"
@implementation Car
-(NSString *)description{
NSLog(@"轮胎:%@ 方形盘:%@,引擎:%@",self.tire,self.wheel,self.engine);
return nil;
}
@end
#import "Car.h"
@protocol Carbuilder <NSObject>
-(void)tire;
-(void)engine;
-(void)wheel;
-(Car*)createCar;
@end
#import "Carbuilder.h"
@interface DZCarBuilder : NSObject<Carbuilder>
@end
#import "DZCarBuilder.h"
@interface DZCarBuilder()
@property (nonatomic,strong) Car *car;
@end
@implementation DZCarBuilder
- (instancetype)init
{
self = [super init];
if (self) {
self.car = [Car new];
}
return self;
}
-(void)tire{
self.car.tire =@"大众的轮胎";
}
-(void)wheel{
self.car.wheel = @"大众的方向盘";
}
-(void)engine
{
self.car.engine=@"大众的引擎";
}
-(Car *)createCar{
return self.car;
}
@end
#import <Foundation/Foundation.h>
#import "Carbuilder.h"
@interface Director : NSObject
-(Car *)createCar:(id<Carbuilder>)carBuider;
@end
#import "Director.h"
@implementation Director
-(Car *)createCar:(id<Carbuilder>)carBuider
{
[carBuider tire];
[carBuider wheel];
[carBuider engine];
return [carBuider createCar];
}
@end
测试代码
id <Carbuilder> builder= [DZCarBuilder new];
Director * director = [Director new];
Car *car = [director createCar:builder];
[car description];
测试结果
[20011:7006293] 轮胎:大众的轮胎 方形盘:大众的方向盘,引擎:大众的引擎
- 协议Carbuilder 代表的是Builder
- DZCarBuilder 具体是实现类(ConcreteBuilder)
- Director就是 Director
- Car 代表Product 类
我们想生产不同的车就实现不同的Carbuilder 就可以了。
应用场景
建造者模式主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
优缺点
优点
- 易于解耦
将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。(依赖倒置原则)
- 易于精确控制对象的创建
将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰
- 易于拓展
增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“。
每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。
缺点
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大
具体代码在demo中
下一篇博客地址
结构性设计模式-适配器模式
网友评论