iOS-工廠方法模式的運用
原文釋出在個人簡書,更多內容歡迎關注筆者簡書 ,評論、互相交流請到簡書,謝謝!
設計模式這個高大上的詞似乎每天都在聽。設計模式在服務端設計時體現的比較明顯。雖然移動端設計模式沒有服務端那麼明顯,但是做為移動端開發人員掌握各種設計模式的思想有助於提高程式碼質量。
今天先聊聊工廠方法模式在iOS端的實際運用。後續通過其他篇幅再聊其他的設計模式。
一些設計模式書籍裡都是這樣描述工廠方法模式:
定義建立物件的介面,讓子類決定例項化哪一個類。工廠方法使得一個類的例項化延遲到其子類。
工廠方法使用的情況:一個類無法預期需要生成哪個類的物件,想讓其子類來指定所生成的物件。
比如:有交通工具這樣一個工廠類,它下面有一個createVehicle生產交通工具這樣一個方法,返回交通工具的例項
交通工具工廠類
下又有飛機工廠類、汽車工廠類、火車工廠類這些子類,我們能知道的是飛機工廠可以生存飛機例項,汽車工廠可以生產汽車例項,火車工廠可以生產火車例項。 所以,只需要在
相應的工廠createVehicle方法中
,返回相應的交通工具例項就可以了。(飛機工廠的createVehicle方法中返回飛機的例項,汽車工廠的createVehicle方法中返回汽車的例項…)
參考上面類圖最直白的理解:建立不同的工廠去生產不同的產品,但是這些工廠的生產產品的方法是一樣的。,如果筆者理解有誤,也隨時歡迎大家指正,多多交流。
我們不直接去建立具體的detailProduct物件
返回不同的product物件例項
。在實際運用時,就可以根據切換不同的工廠,得到不同product例項了。筆者已寫好詳細的demo 說明: 筆者將NXWebViewKit做成了一個元件,所以克隆下來demo結構如下
如果對元件化不瞭解的朋友,可以看筆者之前的幾篇關於元件化實踐的文章
下面筆者將通過實際的應用來說說筆者理解的工廠方法模式。
該demo元件中有三種類型的webView(ProgressWebView、LoadingWebView、AlertWebView)
。
不直接alloc init
webView例項
是通過WebViewFactory工廠基類
中定義的抽象方法createWebViewWithFrame:params
來建立的.
ProgressWebViewFactory 具體實現如下
@implementation ProgressWebViewFactory
+ (WebView *)createWebViewWithFrame:(CGRect)frame params:(NSDictionary *)params {
return [[ProgressWebView alloc] initWithFrame:frame params:params];
}
@end
LoadingWebViewFactory 具體實現如下
@implementation LoadingWebViewFactory
+ (WebView *)createWebViewWithFrame:(CGRect)frame params:(NSDictionary *)params {
return [[LoadingWebView alloc] initWithFrame:frame params:params];
}
@end
AlertWebViewFactory 具體實現如下
@implementation AlertWebViewFactory
+ (WebView *)createWebViewWithFrame:(CGRect)frame params:(NSDictionary *)params {
return [[AlertWebView alloc] initWithFrame:frame params:params];
}
@end
三種不同型別的webView對應三個WebViewFactory的子類工廠,通過重寫父類的抽象方法來生成具體的webView例項,ProgressWebViewFactory工廠
生成ProgressWebView的例項
,LoadingWebViewFactory工廠
生成LoadingWebView的例項
,AlertWebViewFactory工廠
生成AlertWebView的例項
.
工廠設計模式作為各大設計模式書籍的開端、還是比較簡單的。詳細的demo在這裡下載,歡迎交流。