Objective-C設計模式——Factory 方法模式virtual constructor(對象建立)

來源:互聯網
上載者:User

標籤:

Factory 方法模式

Factory 方法模式可以控制對象的建立過程,屏蔽對象建立的細節,可以直接建立出我們所需要的已經配置好的對象。

Factory 方法模式定義了建立方法的介面,讓子類決定執行個體化哪一個類,Factory 方法模式使得一個類的執行個體化延遲到其子類。

Factory 方法的工廠其實是多太的一個經典應用,而其生產的產品取決於使用什麼工廠,符合物件導向設計的開放封閉原則,添加產品只需要添加新的類,而不需要修改原有的代碼。

 

使用情境

1.編譯時間無法準確預期要建立的對象的類;

2.類想讓其子類決定在運行時創見什麼;

3.類有若干輔助類為其子類,而你想返回那個子類這一資訊局部化。

舉個最簡單的例子,NSNumber這個類,可以使用[[NSNumber alloc] init]來建立執行個體,但是並沒有什麼用,除非使用預先定義的Factory 方法才有用,

例如:[NSNumber numberWithBool:YES]訊息會得到NSNumber的子類NSCFBoolean的一個執行個體。

 

建立對象的安全方法

因為用戶端並不需要建立對象的實現細節,細節都會在Factory 方法中得到實現,並且返回最終的產品,如果想要添加新的產品,不需要修改用戶端介面,只需要修改Factory 方法即可。

 

對象Factory 方法和類Factory 方法

個人覺得類Factory 方法其實就是簡單工廠的一種體現,只需要調用不同的方法或者傳遞不同的參數來執行個體化不同的子類。但是這種方法每次添加新產品時都要在抽象類別中添加對應的方法,並不符合開放封閉原則,對象Factory 方法模式只需要添加新的類就可以實現我們想要的效果。

 

Demo

內容比較多:

工廠類


#import <Foundation/Foundation.h>@interface Factory : NSObject-(id)createProduct;@end#import "Factory.h"#import "Product.h"@implementation Factory-(id)createProduct{ return [[Product class] new];}@end

#import "Factory.h"@interface FactoryType1 : Factory@end#import "FactoryType1.h"#import "ProductType1.h"@implementation FactoryType1-(id)createProduct{    return [[ProductType1 class] new];}@end#import "Factory.h"@interface FactoryType2 : Factory@end#import "FactoryType2.h"#import "ProductType2.h"@implementation FactoryType2-(id)createProduct{    return [[ProductType2 class] new];}@end

產品類

#import <Foundation/Foundation.h>@interface Product : NSObject@property(nonatomic, strong) NSString *name;@end#import "Product.h"@implementation Product-(id)init{    if(self){        _name = @"product";    }    return self;}@end#import "Product.h"@interface ProductType1 : Product@end#import "ProductType1.h"@implementation ProductType1-(id)init{    if(self){        self.name = @"productType1";    }    return self;}@end#import "Product.h"@interface ProductType2 : Product@end#import "ProductType2.h"@implementation ProductType2-(id)init{    if(self){        self.name = @"productType2";    }    return self;}@end

用戶端:

        Factory *factory1 = [FactoryType1 new];        Product *product1 = [factory1 createProduct];        NSLog(@"%@",product1.name);                Factory *factory2 = [FactoryType2 new];        Product *product2 = [factory2 createProduct];        NSLog(@"%@",product2.name);        return 0;        /*         *2015-07-19 22:11:13.590 Factory Methods[32054:8351400] productType1         *2015-07-19 22:11:13.591 Factory Methods[32054:8351400] productType2         */

可以看到,列印結果,我們只改變了初始化子類,對應就產生出了不同的產品。

 

對於類Factory 方法就不做示範了,可以參看NSNumber

Objective-C設計模式——Factory 方法模式virtual constructor(對象建立)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.