簡單工廠模式的結構和運用

因爲設計模式學習中須要配合UML圖,因此先學習下UML的經常使用方法git

UML結構類圖的經常使用畫法github

Demo傳送門編程

案例:有蘋果,華爲,三星三種電子產品供外界使用設計模式

普通模式的解決方法

這裏咱們採用面向協議編程的方式,也能夠用繼承方式,這裏推薦面向協議post

1.首先是定義一個協議,並規定協議的方法

協議

協議裏面先規定了一個方法- (void)createProduct;,上面的枚舉先不看,後面使用簡單工廠的時候會用到學習

2.建立三種產品,並遵循協議,實現協議的方法

這裏只貼出一種,其他兩種處理方式同樣優化

.h文件

.m文件

3.客戶端引用以下:

客戶端引用

鑑於普通方法下的劣勢很容易就能看到,客戶不但知道了接口,並且也知道了具體有誰去實現,接口的思想是"封裝隔離",實現類應該是被接口隔離開的,也就是咱們最好只知道 id<ProductProtocol> 可是不知道具體是誰 [[IPhoneProduct alloc] init] 顯然咱們是知道具體產品的設計

那麼若是想要在不知道具體產品的狀況下就能實現接口,該如何實現呢?下面簡單講述一下簡單工廠的設計理念code

簡單工廠的設計

1.認識簡單工廠

在開始用簡單工廠實現上述案例以前,先來認識一下什麼叫簡單工廠cdn

1.簡單工廠的定義:

提供一個建立對象實例的功能,而無需關心其具體實現。被建立實例的類型可使接口,抽象類或者具體的類。

簡而言之,外界不知道一個工廠裏面到底要生成什麼樣的實例對象,只須要傳入一個標識,工廠內部本身就能生產對應的產品,工廠內部是知道具體產品的實現的,最後只須要返回給客戶端一個遵循協議的對象便可,客戶端拿到這個對象就能直接訪問接口協議方法,而不須要關心具體的實現。

下面以一個UML結構圖簡單展現下簡單工廠的結構圖:

UML結構類圖

下面說明一下各個角色的功能和做用

  • Client:客戶端,經過工廠獲取遵循協議的對象,以後就是面向協議編程
  • ProductFactory:簡單工廠,經過客戶端傳入的標識去建立遵循協議的接口對象
  • ProductProtocol:定製客戶所須要的功能接口,也就是協議
  • IPhoneProduct,HuaWeiProduct,SanXingProduct:具體的實現類,實現協議規定的接口

2.代碼實現簡單工廠

接口協議定製

接口定製

具體實現類

實現類.h

實現類.m

HuaWeiProduct,SanXingProduct相似

工廠類:

工廠類.h

工廠類.m

客戶端實現:

簡單工廠客戶端

經過上述代碼能夠看出,客戶端是不知道接口的具體實現的,和具體實現類接觸的類變成了工廠類,咱們能夠這麼理解,工廠類,接口類和具體實現類做爲一個封裝體,暴露給外界的只是工廠類的一個類方法和接口類

後續若是須要再加另外的具體實現類,只須要新增實現類並在工廠類新增一個判斷條件便可

優化方案:爲了不修改工廠類,還可使用配置文件,在配置文件中配置好實現類相關的信息,實現類中須要有type,name(類名)等信息,下面我具體來實現如下:

配置文件

工廠類解析配置文件

大體實現思路就是這樣,總的歸納來講,簡單工廠的本質就是選擇性地去建立具體產品(實現類),工廠裏面主要就是選擇性建立,而實現的難點在於如何選擇性建立,我這裏着重講述的是從客戶端傳遞參數的方式。對於什麼時候選用簡單工廠,能夠從如下兩個方面考慮:

  • 想要徹底封裝隔離具體實現,外部只能經過接口操做封裝體
  • 想要把對外建立的職責幾種管理和控制

3.簡單工廠的優缺點

優勢

  • 具備封裝性,很好地實現了組件的封裝,組件外部實現了面向接口編程
  • 解耦性,實現了客戶端和具體實現類的解耦合

缺點

  • 可能會增長客戶端的複雜度,由於客戶端須要向工廠傳遞參數,就必得理解所傳參數的含義
  • 不方便擴展子工廠
相關文章
相關標籤/搜索