Objective-C设计模式——生成器Builder(对象创建)
生成器
生成器,也成為建造者模式,同樣是創建對象時的設計模式。該模式下有一個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; } @endDirector類,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 = 100 2015-07-21 09:15:04.298 Builder[41745:10008190] BMW: name = BMW ,speed = 120可以看到,不同的builder封裝不同的創建對象邏輯,產生不同的對象,同時分離了創建層和表示層。
轉載于:https://www.cnblogs.com/madpanda/p/4663415.html
總結
以上是生活随笔為你收集整理的Objective-C设计模式——生成器Builder(对象创建)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: yifan的数组
- 下一篇: java.math.BigDecimal