本文首发于我的博客html
生成器模式 又名:建造模式 属于建立型模式,在wikipedia中的定义以下git
生成器模式(英:Builder Pattern)是一种设计模式,又名:建造模式,是一种对象构建模式。它能够将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不一样实现方法能够构造出不一样表现(属性)的对象。github
在如下状况使用生成器模式:算法
建立YZBuilderCar
类,有两个属性,分别是名字和价格设计模式
#import <Foundation/Foundation.h>
@interface YZBuilderCar : NSObject
@property (nonatomic, strong)NSString *name;// 名字
@property (nonatomic, strong)NSString *price;// 价格
-(YZBuilderCar *)makeCar;
@end
复制代码
实现以下bash
#import "YZBuilderCar.h"
@interface YZBuilderCar()
@end
@implementation YZBuilderCar
- (NSString *)description{
return [NSString stringWithFormat:@"我是一辆:%@ 车 价格:%@",self.name,self.price];
}
- (YZProductCar *)makeCar{
YZBuilderCar *car = [[YZBuilderCar alloc] init];
car.name = self.name;
car.price = self.price;
return car;
}
@end
复制代码
YZBMWCar
和YZAudiCar
继承自YZBuilderCar
建立车型YZBMWCar
测试
#import "YZProductCar.h"
@interface YZBMWCar : YZBuilderCar
@end
#import "YZBMWCar.h"
@implementation YZBMWCar
- (instancetype)init
{
self = [super init];
if (self) {
self.name = @"宝马740Li";
self.price = @"98万";
}
return self;
}
@end
复制代码
建立车型YZAudiCar
ui
#import "YZProductCar.h"
@interface YZAudiCar : YZBuilderCar
@end
#import "YZAudiCar.h"
@implementation YZAudiCar
- (instancetype)init
{
self = [super init];
if (self) {
self.name = @"奥迪Q5";
self.price = @"45万";
}
return self;
}
@end
复制代码
YZDirector
#import <Foundation/Foundation.h>
#import "YZBuilderCar.h"
@interface YZDirector : NSObject
// 建造一辆车
+ (YZProductCar *)creatBuickCar:(YZBuilderCar *)builder;
@end
#import "YZDirector.h"
@implementation YZDirector
+ (YZProductCar *)creatBuickCar:(YZBuilderCar *)builder{
YZProductCar *car = [builder makeCar];
return car;
}
@end
复制代码
int main(int argc, const char * argv[]) {
@autoreleasepool {
YZBuilderCar *car = [[YZBMWCar alloc] init];
YZDirector *dir = [YZDirector creatBuickCar:car];
NSLog(@"%@",dir.description);
}
return 0;
}
复制代码
输出为atom
我是一辆:宝马740Li 车 价格:98万spa
首先,建造者模式的封装性很好。使用建造者模式能够有效的封装变化,在使用建造者模式的场景中,通常产品类和建造者类是比较稳定的,所以,将主要的业务逻辑封装在Director类中对总体而言能够取得比较好的稳定性。
其次,建造者模式很容易进行扩展。若是有新的需求,经过实现一个新的ConcreteBuilder类就能够完成,基本上不用修改以前已经测试经过的代码,所以也就不会对原有功能引入风险。
咱们能够看到,建造者模式与工厂模式是极为类似的,整体上,建造者模式仅仅只比工厂模式多了一个"导演类"的角色。在建造者模式的类图中,假如把这个导演类看作是最终调用的客户端,那么图中剩余的部分就能够看做是一个简单的工厂模式了。
与工厂模式相比,建造者模式通常用来建立更为复杂的对象,由于对象的建立过程更为复杂,所以将对象的建立过程独立出来组成一个新的类——导演类。也就是说,工厂模式是将对象的所有建立过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类通常只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,而后将组建好的产品交付给客户端。
建造者模式与工厂模式相似,他们都是建造者模式,适用的场景也很类似。通常来讲,若是产品的建造很复杂,那么请用工厂模式;若是产品的建造更复杂,那么请用建造者模式。