簡單工廠,工廠方法,抽象工廠之比較

2021-05-26 21:20:57 字數 1890 閱讀 8981

建立模式的目的就是為了解決使用和生產責任分離,當然能使用這種模式的前提就是使用者並不關心"產品"的建立邏輯和過程,使用者只需要對建立的結果進行使用.在這種情況下,將使用和建立分離就增加了程式的靈活性,因為"產品"的構建對使用者來說是透明的,如果需要對建立過程增加功能(比如增加建立許可權檢查),不會影響到使用者的使用.

模式的應用有兩個基本的目的,一是復用,二是適應變化.而且這兩個目的在很大程度上也是統一 的.工廠類模式將使用和建立責任分離,其實就是為了適應"建立"的變化.當然這種"適應變化"的代價就是需要增加工廠類,增加了系統的複雜度和開銷.因此選擇模式的乙個重要的工作就是要權衡利弊,其實在建立模式中就有乙個**假設:工廠角色的變化相對固定,工廠類本身的建立非常簡單.這個假設很重要,因為如果工廠本身的建立和可變性都很大的話,採用這種模式就得不償失了.

簡單工廠模式的原理其實很簡單,就是將"產品"的建立工作委託給工廠類的靜態方法來完成,有抽象產品的情況下,使用者只需要用乙個引數呼叫來獲得"產品",而不需要知道具體的產品的細節,比如,抽象產品為水果,使用者如果需要獲取產品"蘋果",則只要將"蘋果"作為引數來呼叫水果工廠的建立水果的方法,而不需要知道蘋果類本身的細節.這是簡單工廠模式的好處.跟工廠方法相比,簡單工廠模式邏輯簡單,額外開銷小(增加產品,不需要增加工廠類,因為是靜態方法,工廠類本身也不需要建立等).

工廠方法模式的原理也是將"產品"的建立委託給工廠類進行,但由於工廠類的建立方法不是靜態的,因此可以利用繼承的好處,將具體的建立工作"延時"到子類進行.這種方式在設計和思考上是有非常大的好處的:將設計分層,每一層都只需要關心同一層面上的事情.工廠方法的做法是每個具體產品都用乙個具體的工廠來進行建立.這樣做的好處是符合物件導向程式設計的開放封閉原則,增加新的產品,只需要增加新的工廠類即可(對擴充套件開放),對任何產品的增加或修改,不會影響其它工廠類和產品類(對修改封閉),但缺點也是非常明顯的,就是產品多的時候,系統中的類會很多.(成倍增加).跟簡單工廠模式相比,一是系統不簡潔,二是增加了工廠類的建立,三是使用者的選擇產品邏輯變成了對工廠類的選擇,降低了選擇的直觀性.

抽象工廠方法可以看作是工廠方法的更一般的表達,抽象工廠針對的是產品族的概念(如果只有一種產品,就是工廠模式),如果按照抽象工廠的嚴格意義上來講,應用場景會比較少(多種資料庫支援,多種語言版本的情況可以用).能使用抽象工廠的應用場景一般可以表達為矩陣模型,同一行的是不同環境中的同乙個產品的實現,同一列的產品都處於同乙個應用環境下,系統每次只會用到一種環境的產品.典型的應用是windows和linux下的介面控制項.如果只一族產品,則抽象工廠就可以退化成簡單工廠來實現.

在實際使用中,簡單工廠模式和工廠方法模式用得比較多,而抽象工廠方法用得比較少.當然,抽象工廠在類似於資料庫連線方面應用還是比較好的,比如系統如果需要支撐多種資料庫系統,就可以採用抽象工廠來進行構建.

其實類的建立現在有了一些新的變化,例如,將建立依賴放在配置檔案,採用反射技術來構造例項,這種方法的好處是一時可以減少工廠類,極端的情況下乙個工廠方法就可以了,同時工廠類與產品類也脫耦。現在有很多框架都採用這種方式(如nhibernate等),就是所謂的依賴注入,如下所示:

public inte***ce ipersondao

public class persondao : ipersondao

{#region ipersondao 成員

myobjects.xml

<?xml version="1.0" encoding="utf-8" ?>

bc:20120528

依賴配置的建立方式,本質上可以看作是簡單工廠或者工廠方法,但這種方式的侷限性也非常大:將使用者選擇產品的邏輯放在了配置檔案裡,一是配置檔案的表達能力會比較弱,如果選擇邏輯比較複雜的情況下,就無法適用.二是選擇是在配置檔案中,導致邏輯相對靜態,無法實現動態的選擇邏輯,這個侷限根本原因也在於一.依賴配置建立的邏輯適合哪些建立邏輯簡單,使用者選擇產品邏輯相對靜態的,但需建立產品的數量比較大的情況下.

簡單工廠,工廠方法,抽象工廠

簡單工廠,工廠方法,抽象工廠都屬於設計模式中的建立型模式。其主要功能都是幫助我們把物件的例項化部分抽取了出來,優化了系統的架構,並且增強了系統的擴充套件性。本文是本人對這三種模式學習後的乙個小結以及對他們之間的區別的理解。簡單工廠 簡單工廠模式的工廠類一般是使用靜態方法,通過接收的引數的不同來返回不...

簡單工廠 工廠方法 抽象工廠

簡單工廠 乙個工廠類 根據傳入的參量決定建立出哪一種產品類的例項 直接乙個工廠類,內部通過 swith operator add類實現該介面 adddao implements dao dao的實現類 客戶端 dao dao new adddao dao.createoper 產生物件 這樣如果需要...

簡單工廠 工廠方法 抽象工廠

一 簡單工廠 factory 集中管理物件的產生,業務 只需要呼叫相應的方法,傳入不同的引數區分物件,就能得到想要的物件了 把業務 和對應的物件解耦 建立乙個抽象類 public abstract class cellphone public abstract void show 建立實現抽象類的實...