本文首發於我的博客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類就能夠完成,基本上不用修改以前已經測試經過的代碼,所以也就不會對原有功能引入風險。
咱們能夠看到,建造者模式與工廠模式是極爲類似的,整體上,建造者模式僅僅只比工廠模式多了一個"導演類"的角色。在建造者模式的類圖中,假如把這個導演類看作是最終調用的客戶端,那麼圖中剩餘的部分就能夠看做是一個簡單的工廠模式了。
與工廠模式相比,建造者模式通常用來建立更爲複雜的對象,由於對象的建立過程更爲複雜,所以將對象的建立過程獨立出來組成一個新的類——導演類。也就是說,工廠模式是將對象的所有建立過程封裝在工廠類中,由工廠類向客戶端提供最終的產品;而建造者模式中,建造者類通常只提供產品類中各個組件的建造,而將具體建造過程交付給導演類。由導演類負責將各個組件按照特定的規則組建爲產品,而後將組建好的產品交付給客戶端。
建造者模式與工廠模式相似,他們都是建造者模式,適用的場景也很類似。通常來講,若是產品的建造很複雜,那麼請用工廠模式;若是產品的建造更復雜,那麼請用建造者模式。