Objective-C設計模式——產生器Builder(對象建立)

來源:互聯網
上載者:User

標籤:

產生器

產生器,也成為建造者模式,同樣是建立對象時的設計模式。該模式下有一個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(對象建立)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.