1. 程式人生 > >iOS常用設計模式——工廠方法(簡單工廠模式,工廠方法模式, 抽象工廠模式)

iOS常用設計模式——工廠方法(簡單工廠模式,工廠方法模式, 抽象工廠模式)

1. 簡單工廠模式

如何理解簡單工廠,工廠方法, 抽象工廠三種設計模式?

簡單工廠的生活場景,賣早點的小攤販,他給你提供包子,饅頭,地溝油烙的煎餅等,小販是一個工廠,它生產包子,饅頭,地溝油烙的煎餅。該場景對應的UML圖如下所示:


圖1:簡單工廠模式UML圖

簡單工廠模式的參與者:

工廠(Factory)角色:接受客戶端的請求,通過請求負責建立相應的產品物件。

抽象產品(Abstract Product)角色:是工廠模式所建立物件的父類或是共同擁有的介面。可是抽象類或介面。

具體產品(ConcreteProduct)物件:工廠模式所建立的物件都是這個角色的例項。

簡單工廠模式的演變:

1.當系統中只有唯一的產品時,可以省略抽象產品,如圖1所示。這樣,工廠角色與具體產品可以合併。

簡單工廠模式的優缺點:

1.)工廠類含有必要的建立何種產品的邏輯,這樣客戶端只需要請求需要的產品,而不需要理會產品的實現細節。

2.)工廠類只有一個,它集中了所有產品建立的邏輯,它將是整個系統的瓶頸,同時造成系統難以拓展。

3.)簡單工廠模式通常使用靜態工廠方法,這使得工廠類無法由子類繼承,這使得工廠角色無法形成基於繼承的等級結構。


2. 工廠方法模式

工廠方法使用OOP的多型性,將工廠和產品都抽象出一個基類,在基類中定義統一的介面,然後在具體的工廠中建立具體的產品。工廠方法的生活場景,聯合利華要生產“夏士蓮”和“清揚

兩款洗髮水,它會建一個生產“夏士蓮的工廠和一個生產“清揚的工廠。


圖2:工廠方法的UML圖

工廠方法模式中的參與者:

抽象工廠角色:與應用程式無關,任何在模式中建立物件的工廠必須實現這個介面。具體工廠角色:實現了抽象工廠介面的具體類,含有與引用密切相關的邏輯,並且受到應用程式的呼叫以建立產品物件。抽象產品角色:工廠方法所建立產品物件的超型別,也就是產品物件的共同父類或共同擁有的介面。具體產品角色:這個角色實現了抽象產品角色所聲名的介面。工廠方法所建立的每個具體產品物件都是某個具體產品角色的例項。

工廠方法的優缺點:

1.降低了工廠類的內聚,滿足了類之間的層次關係,又很好的符合了面向物件設計中的單一職責原則,這樣有利於程式的拓展,如圖三所示:

圖3:工廠方法的拓展UML圖

總結:共性提取出來,根據各自的個性建立各自的繼承共性的實現

3. 抽象工廠設計模式

所謂抽象工廠是指一個工廠等級結構可以創建出分屬於不同產品等級結構的一個產品族中的所有物件,以建立Unix控制元件和Windows控制元件為例說明,我們需要一個抽象工廠下面有兩個子工廠,一個叫做UnixFactory,用於生產Unix族控制元件,一個叫做WinFactory,用於生產Win族控制元件。抽象工廠與工廠方法的區別是,工廠方法中的具體工廠一般只生產一個或幾個控制元件物件,而抽象工廠中的具體工廠生產的是一族控制元件物件。如圖4所示。


圖4:抽象工廠設計模式UML圖

抽象工廠中的參與者:

抽象工廠(Abstract Factory)角色:擔任這個角色的是工廠方法模式的核心,它是與應用系統商業邏輯無關的。

具體工廠(Concrete Factory)角色:這個角色直接在客戶端的呼叫下建立產品的例項。這個角色含有選擇合適的產品物件的邏輯,而這個邏輯是與應用系統的商業邏輯緊密相關的。

抽象產品(Abstract Product)角色:擔任這個角色的類是工廠方法模式所建立的物件的父類,或它們共同擁有的介面。

具體產品(Concrete Product)角色:抽象工廠模式所建立的任何產品物件都是某一個具體產品類的例項。這是客戶端最終需要的東西,其內部一定充滿了應用系統的商業邏輯。

抽象工廠的使用場景:

  • 一個系統不應當依賴於產品類例項如何被建立、組合和表達的細節,這對於所有形態的工廠模式都是重要的。
  • 這個系統有多於一個的產品族,而系統只消費其中某一產品族。
  • 同屬於同一個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。
  • 系統提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴於實現。

抽象工廠模式與工廠方法模式的區別

工廠方法模式:每個抽象產品派生多個具體產品類,每個抽象工廠類派生多個具體工廠類,每個具體工廠類負責一個具體產品的例項建立;抽象工廠模式:每個抽象產品派生多個具體產品類,每個抽象工廠派生多個具體工廠類,每個具體工廠負責多個(一系列)具體產品的例項建立。



//在UIKit框架下,我們用工廠方法和抽象工廠兩種設計模式分別實現了兩份Demo, 不理解兩種設計模式該如何實現的朋友可以到這裡下載:  

參考文章: