標籤:
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(對象建立)