Objective-C设计模式——生成器Builder(对象创建)
生成器
生成器,也成為建造者模式,同樣是創(chuàng)建對(duì)象時(shí)的設(shè)計(jì)模式。該模式下有一個(gè)Director(指揮者),客戶端知道該類引用用來(lái)創(chuàng)建產(chǎn)品。還有一個(gè)Builder(建造者),建造者知道具體創(chuàng)建對(duì)象的細(xì)節(jié)。
指揮者只是起到協(xié)調(diào)的作用,它有一個(gè)Builder引用用于指揮Builder如何創(chuàng)建對(duì)象,Builder內(nèi)就是為了構(gòu)建對(duì)象的算法。
其實(shí)生成器模式,就是為了定制某些特定對(duì)象而產(chǎn)生的模式。對(duì)象的過(guò)長(zhǎng)往往非常的復(fù)雜,如果不是用該模式來(lái)創(chuàng)建對(duì)象,對(duì)象創(chuàng)建類將會(huì)非常的冗余且難以復(fù)用。使用生成器將表現(xiàn)層和創(chuàng)建層分離更加易于擴(kuò)展和解耦。
使用場(chǎng)景
1.需要?jiǎng)?chuàng)建涉及各種部件的復(fù)雜對(duì)象。創(chuàng)建對(duì)象的算法應(yīng)該獨(dú)立于部件的裝配方式。常見(jiàn)的例子是構(gòu)建組合對(duì)象。
2.構(gòu)建過(guò)程需要以不同的方式(例如,部件或表現(xiàn)的不同組合)構(gòu)建對(duì)象。
?
生成器與抽象工廠對(duì)比
生成器
構(gòu)建復(fù)雜對(duì)象
以多個(gè)步驟構(gòu)建對(duì)象
在構(gòu)建對(duì)象過(guò)程的最后一步返回產(chǎn)品
專注于一個(gè)特定產(chǎn)品
?
抽象工廠
構(gòu)建簡(jiǎn)單或復(fù)雜對(duì)象
以單一步驟構(gòu)建對(duì)象
以單一方式構(gòu)建對(duì)象
立刻返回產(chǎn)品
強(qiáng)調(diào)一套產(chǎn)品
?
Demo
比如汽車制造廠需要制造兩種不同的汽車:
首相創(chuàng)建Car類,有name和speed兩個(gè)屬性
#import <Foundation/Foundation.h>@interface Car : NSObject@property(nonatomic, strong)NSString *name;@property(nonatomic ,assign)int speed;@end#import "Car.h"@implementation Car@end創(chuàng)建Builder,Builder封裝了創(chuàng)建類的具體細(xì)節(jié)
#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知道生產(chǎn)產(chǎn)品,但并不知道具體生產(chǎn)細(xì)節(jié)。
#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);結(jié)果:
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封裝不同的創(chuàng)建對(duì)象邏輯,產(chǎn)生不同的對(duì)象,同時(shí)分離了創(chuàng)建層和表示層。
轉(zhuǎn)載于:https://www.cnblogs.com/madpanda/p/4663415.html
總結(jié)
以上是生活随笔為你收集整理的Objective-C设计模式——生成器Builder(对象创建)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: yifan的数组
- 下一篇: java.math.BigDecimal