概念
設(shè)計模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。簡單工廠模式是由工廠類根據(jù)傳入的參數(shù),動態(tài)決定應(yīng)該創(chuàng)建出對應(yīng)的產(chǎn)品類的實例。
實例
拿一個計算器舉例,有兩個可以輸入的數(shù)值,一個方法可以獲取計算的結(jié)果,我們可以先抽象出來一個計算處理類:
@interface Calculate : NSObject
/// 第一個數(shù)字
@property(nonatomic,assign) CGFloat firstNum;
/// 第二個數(shù)字
@property(nonatomic,assign) CGFloat secondNum;
/// 獲得結(jié)果
- (CGFloat)getResult;
@end
以下計算規(guī)則類都繼承自 Calculate
加法計算類:
#import "Calculate_Add.h"
@implementation Calculate_Add
- (CGFloat)getResult{
return self.firstNum + self.secondNum;
}
@end
減法計算類:
#import "Calculate_Sub.h"
@implementation Calculate_Sub
- (CGFloat)getResult{
return self.firstNum - self.secondNum;
}
@end
工廠實現(xiàn)
工廠類的定義:
@class Calculate;
@interface CalculateFactory : NSObject
+ (Calculate *)createOperateWithStr:(NSString *)str;
@end
工廠方法的實現(xiàn):
#import "CalculateFactory.h"
#import "Calculate_Add.h"
#import "Calculate_Sub.h"
@implementation CalculateFactory
+ (Calculate *)createOperateWithStr:(NSString *)str {
if ([str isEqualToString:@"+"]) {
Calculate_Add *calculate_Add = [[Calculate_Add alloc] init];
return calculate_Add;
}else if ([str isEqualToString:@"-"]){
Calculate_Sub *calculate_Sub = [[Calculate_Sub alloc] init];
return calculate_Sub;
}else{
return [[Calculate alloc] init];
}
}
@end
調(diào)用
Calculate *calculate_add = [CalculateFactory createOperateWithStr:@"+"];
calculate_add.firstNum = 3.0f;
calculate_add.secondNum = 6.0f;
NSLog(@"簡單工廠模式-求和:%f",[calculate_add getResult]);
Calculate *calculate_sub = [CalculateFactory createOperateWithStr:@"-"];
calculate_sub.firstNum = 9.0f;
calculate_sub.secondNum = 3.0f;
NSLog(@"簡單工廠模式-求差:%f",[calculate_sub getResult]);
效果:

效果
優(yōu)點:
簡單工廠模式的核心是工廠類,該類中含有必要的判斷邏輯,可以決定在什么時候創(chuàng)建哪一個產(chǎn)品類的實例,客戶端可以免除直接創(chuàng)建產(chǎn)品對象的責(zé)任,而僅僅負(fù)責(zé)“消費”產(chǎn)品。 簡單工廠模式實現(xiàn)了對責(zé)任的分割。
缺點:
模式中工廠類集中了所有的產(chǎn)品創(chuàng)建邏輯,形成一個無所不知的全能類,當(dāng)所有的類不是繼承自同一個父類的時候擴(kuò)展比較困難。
源碼
源碼地址:FactoryPatternDemo