因爲設計模式學習中須要配合UML圖,因此先學習下UML的經常使用方法git
UML結構類圖的經常使用畫法github
Demo傳送門編程
案例:有蘋果,華爲,三星三種電子產品供外界使用設計模式
這裏咱們採用面向協議編程的方式,也能夠用繼承方式,這裏推薦面向協議post
協議裏面先規定了一個方法- (void)createProduct;
,上面的枚舉先不看,後面使用簡單工廠的時候會用到學習
這裏只貼出一種,其他兩種處理方式同樣優化
鑑於普通方法下的劣勢很容易就能看到,客戶不但知道了接口,並且也知道了具體有誰去實現,接口的思想是"封裝隔離",實現類應該是被接口隔離開的,也就是咱們最好只知道 id<ProductProtocol>
可是不知道具體是誰 [[IPhoneProduct alloc] init]
顯然咱們是知道具體產品的設計
那麼若是想要在不知道具體產品的狀況下就能實現接口,該如何實現呢?下面簡單講述一下簡單工廠的設計理念code
在開始用簡單工廠實現上述案例以前,先來認識一下什麼叫簡單工廠cdn
1.簡單工廠的定義:
提供一個建立對象實例的功能,而無需關心其具體實現。被建立實例的類型可使接口,抽象類或者具體的類。
簡而言之,外界不知道一個工廠裏面到底要生成什麼樣的實例對象,只須要傳入一個標識,工廠內部本身就能生產對應的產品,工廠內部是知道具體產品的實現的,最後只須要返回給客戶端一個遵循協議的對象便可,客戶端拿到這個對象就能直接訪問接口協議方法,而不須要關心具體的實現。
下面以一個UML結構圖簡單展現下簡單工廠的結構圖:
下面說明一下各個角色的功能和做用
接口協議定製
具體實現類
HuaWeiProduct,SanXingProduct相似
工廠類:
客戶端實現:
經過上述代碼能夠看出,客戶端是不知道接口的具體實現的,和具體實現類接觸的類變成了工廠類,咱們能夠這麼理解,工廠類,接口類和具體實現類做爲一個封裝體,暴露給外界的只是工廠類的一個類方法和接口類
後續若是須要再加另外的具體實現類,只須要新增實現類並在工廠類新增一個判斷條件便可
優化方案:爲了不修改工廠類,還可使用配置文件,在配置文件中配置好實現類相關的信息,實現類中須要有type,name(類名)等信息,下面我具體來實現如下:
大體實現思路就是這樣,總的歸納來講,簡單工廠的本質就是選擇性地去建立具體產品(實現類),工廠裏面主要就是選擇性建立,而實現的難點在於如何選擇性建立,我這裏着重講述的是從客戶端傳遞參數的方式。對於什麼時候選用簡單工廠,能夠從如下兩個方面考慮:
優勢
缺點