iOS 工廠模式
文章目錄
- iOS 工廠模式
- 前言
- 工廠模式
- 簡單工廠
- 案例
- 場景分析
- 蘋果類
- 優點
- 缺點
- 小結
- 工廠模式
- 客戶端調用
- **優點**
- **缺點**
- 抽象工廠模式
- 三個模式對比
前言
筆者之前學習了有關于設計模式的六大原則,之前簡單了解過這個工廠模式,今天主要是重新學習一下這個模式,正式系統性的學習一下這個模式
工廠模式
工廠模式就是指我們在創建對象的時候不會對客戶端暴露創建邏輯,并且是通過使用一個共同的接口來指向新創建的對象,在OC中最經典的例子是下面這個:
UIButton* button = [UIButton buttonWithType:UIButtonTypeSystem];
這里我們并不處理創建邏輯,而是通過我們需要什么就會創建出對應需求的一個button
工廠模式主要分成三類:
- 簡單工廠: 簡單工廠不是一個模式,而是一種編程習慣,提供一個創建對象實例的功能,而無需關系他的具體實現.被創建的類型可以是接口,抽象類,具體類
- 工廠模式:要依賴抽象,不要依賴具體
- 抽象工廠模式:提供一個創建一系列相關或者互相依賴的接口,而無需依賴具體類
簡單工廠
簡單工廠模式(Simple Factory Pattern):專門定義一個類(工廠類)來負責創建其他類的實例。可以根據創建方法的參數來返回不同類的實例,被創建的實例通常都具有共同的父類。
就相當于一個工廠添加新的產品.
總結來說,就是將各式各樣if-else的判斷由業務層,放到了工廠類里面
簡單工廠模式的結果比較簡單:
- 工廠:工廠負責創建所有產品實例的邏輯
- 具體產品:工廠鎖創建的所有產品對象類,它以自己的方式來實現其共同父類聲明的接口
案例
一個商店中售賣不同品牌的手機:華為手機,小米手機,蘋果手機
場景分析
- 工廠:Phone, 手機工廠類
- 具體產品:華為手機,小米手機,蘋果手機
- (Factory *)sellPhone:(NSString *)type {if ([type isEqualToString:@"ApplePhone"]) {ApplePhone* phone = [[ApplePhone alloc] init];return phone;} else if ([type isEqualToString:@"HuaWeiPhone"]) {HuaWeiPhone* phone = [[HuaWeiPhone alloc] init];return phone;} else if ([type isEqualToString:@"RedmiPhone"]) {RedmiPhone* phone = [[RedmiPhone alloc] init];return phone;}return nil;
}
蘋果類
- (void)sellPhone{NSLog(@"售賣蘋果手機");
}
其他類也類似
我們可以把具體創建的信息放在某一個產品自己類中.這樣把它封裝好,然后我們客戶端調用的時候就可以直接調用最外層的工廠方法:
- (Factory *)sellPhone:(NSString *)type // 外層只用調用這個方法就可以獲得對應的實例
這樣我們就可以把創建處理的內容放在對應的類中去,可以減少對于外部工廠的修改,讓邏輯更緊密,邏輯封裝的更好
優點
客戶端只需要給工廠類傳入一個正確的(約定好的)參數,就可以獲取你所需要的對象,而不需要知道其創建細節,一定程度上減少系統的耦合
缺點
如果我們要是在添加Cell
,那么我們就需要修改FactoryCell
的方法,違反了開閉原則。
簡單來說就是違反了依賴倒置原則,讓高層組件client依賴于底層組件。違反這個原則的后果就是一旦底層組件改動,那么高層組件也就必須改動,違反了開閉原則。
小結
什么時候使用簡單工廠
- 想完全封裝隔離具體實現,讓外部只能通過抽象類或者接口來操作,在上面的例子中,就是只操作
factory
,而不操作具體類,此時可以使用簡單工廠,讓客戶端通過簡單工廠來選擇創建具體的類,不需要創建的具體過程 - 想把創建對象的職責集中管理,一個簡單啊工廠可以創建許多相關或者不相關的對象,所以可以把對象的創建集中到簡單工廠中進行管理
工廠模式
工廠方法模式(Factory Method Pattern)又稱為工廠模式,工廠父類負責定義創建產品對象的公共接口,而工廠子類則負責生成具體的產品對象,即通過不同的工廠子類來創建不同的產品對象。
不同的工廠生成不同的子類.通過協議來實現一個繼承的效果,這樣可以統一調用協議方法,然后不同的工廠重寫協議函數實現對應的一個產品的創建
這里的適用場景其實與簡單工廠類似,都是創建數據行為都比較類似的對象,但是和簡單工廠不同的是,在工廠方法模式中,因為常化鋼建對象的責任交給了抽象工廠的子類,因此客戶端需要知道其所需的產品對應的工廠子類,而不是簡單工廠中的參數
工廠模式主要包括:
- 抽象工廠:抽象工廠負責聲明具體工廠的創建產品的接口
- 具體工廠:具體工廠負責創建產品
- 具體產品:具體產品是工廠所創建的所有產品對象類,它用自己的方式來實現共同父類聲明的接口
這對賣手機的案例我們新的UML圖
通過工廠模式定義我們知道,工廠模式主要是把對象的創建延遲到子類執行
創建工廠的一個抽象類
@protocol PhoneMakeProtocol <NSObject>+ (id<PhoneProtocol>)sellPhone:(NSInteger)type; // <PhoneProtocol> 這個協議是意味著這個類可以被認為是我們的手機類@end
然后讓工廠實例:
// 蘋果手機的工廠類@interface iPhoneFactory : NSObject <PhoneProtocol>@end@implementation iPhoneFactory- (id<PhoneProtocol>)sellPhone:(NSInteger)type {return [[ApplePhone alloc] init];}@end
產品的抽象類:
@interface ApplePhone : NSObject <PhoneProtocol>- (void)sellPhone;@end@implementation ApplePhone
- (void)sellPhone{NSLog(@"售賣蘋果手機");
}@end
這樣客戶端就可以根據我們不同的工廠獲取不同的一個iPhone的內容
客戶端調用
factory = [iPhoneFactory new];
ApplePhone* phone = = [factory sellPhone:11];
[phone sellphone];
優點
更容易擴展新版本,如果需要加入新的實現,只需要擴展一個新類,然后繼承抽象接口實現工廠方法即可。遵循了開閉原則
缺點
具體產品和工廠方法耦合,因為在工廠方法中需要創建具體實例,所以它們會耦合
抽象工廠模式
抽象工廠模式:提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類。
有時候我們需要一個工廠可以提供多個產品對象,而不是單一的產品對象。比如系統中有多于一個的產品族,而每次只使用其中某一產品族,屬于同一個產品族的產品將在一起使用
接著看新的業務:
仔細看一下這六個產品的特點,我們可以把這它們劃分在三個產品族里面:
- 1、蘋果產品族:蘋果手機,蘋果電腦
- 2、小米產品族:小米手機,小米電腦
- 3、華為產品族:華為手機,華為電腦
這樣我們只需要添加艾一個新的方法就變成了一個抽象工廠
三個模式對比
- 當單一類型產品比較少的時候,用簡單工廠模式
- 單一產品各種定制比較多的時候,用工廠模式
- 多種類型產品的時候,使用抽象工廠模式
- 抽象工廠模式和工廠模式 工廠模式針對單獨產品的創建,而抽象工廠注重一個產品系列的創建。如果產品系列只有一個產品的 話,那么抽象工廠就退換到工廠模式了。在抽象工廠中使用工廠方法來提供具體實現,這個時候他們聯 合使用。
- 工廠模式和簡單工廠 兩者非常類似,都是用來做選擇實現的。不同的地方在于簡單工廠在自身就做了選擇實現。而工廠模式 則是把實現延遲到子類執行。如果把工廠方法的選擇實現直接在父類實現,那么此時就退化為簡單工廠 模式了。
- 簡單工廠和抽象工廠 簡單工廠用于做選擇實現,每個產品的實現之間沒有依賴關系。而抽象工廠實現的一個產品系列,相互 之間有關聯。這是他們的區別