標籤:
產生器
產生器,也成為建造者模式,同樣是建立對象時的設計模式。該模式下有一個Director(指揮者),用戶端知道該類引用用來建立產品。還有一個Builder(建造者),建造者知道具體建立對象的細節。
指揮者只是起到協調的作用,它有一個Builder引用用於指揮Builder如何建立對象,Builder內就是為了構建對象的演算法。
其實產生器模式,就是為了定製某些特定對象而產生的模式。對象的過長往往非常的複雜,如果不是用該模式來建立對象,對象建立類將會非常的冗餘且難以複用。使用產生器將表現層和建立層分離更加易於擴充和解耦。
使用情境
1.需要建立涉及各種組件的複雜物件。建立對象的演算法應該獨立於組件的裝配方式。常見的例子是構建組合對象。
2.構建過程需要以不同的方式(例如,組件或表現的不同組合)構建對象。
產生器與抽象工廠對比
產生器
構建複雜物件
以多個步驟構建對象
在構建對象過程的最後一步返回產品
專註於一個特定產品
抽象工廠
構建簡單或複雜物件
以單一步驟構建對象
以單一方式構建對象
立刻返回產品
強調一套產品
Demo
比如汽車製造廠需要製造兩種不同的汽車:
首相建立Car類,有name和speed兩個屬性
#import <Foundation/Foundation.h>@interface Car : NSObject@property(nonatomic, strong)NSString *name;@property(nonatomic ,assign)int speed;@end#import "Car.h"@implementation Car@end
建立Builder,Builder封裝了建立類的具體細節
#import <Foundation/Foundation.h>#import "Car.h"@interface CarBuilder : NSObject-(CarBuilder *)buildCar;-(CarBuilder *)buildCarName;-(CarBuilder *)buildCarSpeed;-(Car *)getProduct;@end#import "CarBuilder.h"@implementation CarBuilder{ Car *_product;}-(CarBuilder *)buildCar{ _product = nil; _product = [Car new]; return self;}-(CarBuilder *)buildCarName{ _product.name = @"benz"; return self;}-(CarBuilder *)buildCarSpeed{ _product.speed = 100; return self;}@end
具體的Builder類:
#import <Foundation/Foundation.h>#import "CarBuilder.h"@interface CarBuilderBenz : CarBuilder@end#import "CarBuilderBenz.h"@implementation CarBuilderBenz{ Car *_product;}-(CarBuilder *)buildCar{ _product = nil; _product = [Car new]; return self;}-(CarBuilder *)buildCarName{ _product.name = @"benz"; return self;}-(CarBuilder *)buildCarSpeed{ _product.speed = 100; return self;}-(Car *)getProduct{ return _product;}@end#import <Foundation/Foundation.h>#import "CarBuilder.h"@interface CarBuilderBMW : CarBuilder@end#import "CarBuilderBMW.h"@implementation CarBuilderBMW{ Car *_product;}-(CarBuilder *)buildCar{ _product = nil; _product = [Car new]; return self;}-(CarBuilder *)buildCarName{ _product.name = @"BMW"; return self;}-(CarBuilder *)buildCarSpeed{ _product.speed = 120; return self;}-(Car *)getProduct{ return _product;}@end
Director類,Director知道生產產品,但並不知道具體生產細節。
#import <Foundation/Foundation.h>#import "CarBuilder.h"#import "Car.h"@interface CarDirector : NSObject-(Car *)createCarBenz:(CarBuilder *)builder;-(Car *)createCarBMW:(CarBuilder *)builder;@end#import "CarDirector.h"@implementation CarDirector-(Car *)createCarBenz:(CarBuilder *)builder{ [builder buildCar]; [builder buildCarName]; [builder buildCarSpeed]; return [builder getProduct];}-(Car *)createCarBMW:(CarBuilder *)builder{ [builder buildCar]; [builder buildCarName]; [builder buildCarSpeed]; return [builder getProduct];}@end
用戶端代碼:
CarDirector *director = [CarDirector new]; CarBuilderBenz *benzBuilder = [CarBuilderBenz new]; CarBuilderBMW *BMWBuilder = [CarBuilderBMW new]; Car *benz = [director createCarBenz:benzBuilder]; Car *bmw = [director createCarBMW:BMWBuilder]; NSLog(@"benz: name = %@ ,speed = %d",benz.name ,benz.speed); NSLog(@"BMW: name = %@ ,speed = %d",bmw.name ,bmw.speed);
結果:
2015-07-21 09:15:04.298 Builder[41745:10008190] benz: name = benz ,speed = 1002015-07-21 09:15:04.298 Builder[41745:10008190] BMW: name = BMW ,speed = 120
可以看到,不同的builder封裝不同的建立對象邏輯,產生不同的對象,同時分離了建立層和展示層。
Objective-C設計模式——產生器Builder(對象建立)