概念
工廠方法模式(Factory Method Pattern)在基類中建立一個(gè)抽象方法,子類可以通過改寫這一方法來改變創(chuàng)建對象的具體過程。工廠方法模式讓子類來決定如何創(chuàng)建對象,來達(dá)到封裝的目的。
實(shí)例
接下來還是使用計(jì)算器的例子,我們先實(shí)現(xiàn)一個(gè)工廠協(xié)議 CalculateFactoryProtocol 返回一個(gè)計(jì)算處理類:
@class Calculate;
@protocol CalculateFactoryProtocol <NSObject>
+ (Calculate *)createCalculate;
@end
工廠實(shí)現(xiàn)
然后創(chuàng)建相應(yīng)的用于創(chuàng)建生產(chǎn)計(jì)算方法處理類的工廠(都遵循 CalculateFactoryProtocol 協(xié)議),實(shí)現(xiàn)協(xié)議中的協(xié)議方法 createCalculate,返回一個(gè)計(jì)算處理父類,而所實(shí)例化的為各個(gè)計(jì)算處理方法類(都是繼承自計(jì)算處理父類 Calculate):
AddFactory.h
#import <Foundation/Foundation.h>
#import "CalculateFactoryProtocol.h"
@interface AddFactory : NSObject <CalculateFactoryProtocol>
@end
AddFactory.m
#import "AddFactory.h"
#import "Calculate_Add.h"
@implementation AddFactory
+ (Calculate *)createCalculate {
return [[Calculate_Add alloc] init];
}
@end
SubFactory.h
#import <Foundation/Foundation.h>
#import "CalculateFactoryProtocol.h"
@interface SubFactory : NSObject <CalculateFactoryProtocol>
@end
SubFactory.m
#import "SubFactory.h"
#import "Calculate_Sub.h"
@implementation SubFactory
+ (Calculate *)createCalculate {
return [[Calculate_Sub alloc] init];
}
@end
調(diào)用
Calculate *calculate_add = [AddFactory createCalculate];
calculate_add.firstNum = 3.0f;
calculate_add.secondNum = 6.0f;
NSLog(@"工廠方法模式-求和:%f",[calculate_add getResult]);
Calculate *calculate_sub = [SubFactory createCalculate];
calculate_sub.firstNum = 9.0f;
calculate_sub.secondNum = 3.0f;
NSLog(@"工廠方法模式-求差:%f",[calculate_sub getResult]);
執(zhí)行結(jié)果:

執(zhí)行結(jié)果
從對象的創(chuàng)建來講,這個(gè)將對象的創(chuàng)建擴(kuò)展到了對象子類,從設(shè)計(jì)原則中中的依賴角度來看,原來的工廠需要依賴的各種具體的服裝子類的引用,現(xiàn)在將這些進(jìn)行各種分類,這里是以工廠的形式進(jìn)行分類,抽象組件不依賴于具體的實(shí)現(xiàn)組件,已經(jīng)完成的擴(kuò)展可以不需要變化,如果有新增需求只需要增加新的功能接口,高層組件不需要太大的變化。