為什麼工廠模式是華而不實的—淺談工廠模式的利與弊
轉載請註明出處:http://blog.csdn.net/singwhatiwanna/article/details/17428923
說明:博主虛心接受大家的抨擊,批評,指正
前言
我一直想介紹下工廠模式,我曾經搞過J2EE,用的是輕量級SSH框架,其中Spring有IOC概念,可以稱之為控制反轉或者依賴注入,在系統開發中,IOC可以很好的替代工廠模式。若干年前,我只用過IOC,並沒有用過工廠模式,但是工廠模式這個概念卻是給我留下了深深的印象,畢竟,它是我所聽說過第一個設計模式,我想它應該是很強大的吧。但是,事情不是我想的那個樣子的,在我之前所參與的專案(Android)中幾乎沒有工廠模式的身影,僅僅是有一個專案採用了簡單工廠模式去管理所有的業務管理器。後來,我開始仔細研究工廠模式,發現工廠模式是讓我失望的。工廠模式有三種實現方式:簡單工廠、工廠方法和抽象廣場,除了簡單工廠我還發現了一點使用價值外,後兩者我基本沒發現有啥可使用價值。也許我的理解還不夠透徹,但是目前網上存在的大部分介紹工廠模式的文章都體現了一點:華而不實,難以實際應用。一篇文章不能清晰的介紹一個概念,不能清晰的說明為什麼要使用這個東西以及如何使用這個東西,那麼這篇文章不算好文章的。我目前所看到的關於工廠模式的介紹都是不充分的,包括我寫的這篇,期待真正的好文章出現。下面將介紹簡單工廠模式以及一個實際專案中使用的例子,後面我將會簡單闡述我的觀點:為什麼工廠模式是華而不實的。
簡單工廠模式
1.為什麼要使用工廠模式
直接目的:避免在程式碼中出現大量的new關鍵字
根本目的:將物件的建立統一起來便於維護和整體把控
這一點可以理解,加入你在專案中new了某個物件100次,一年後由於業務邏輯變更,構造方法多了一個引數,你會怎麼辦?你應該會這麼做:找到這100個物件new的地方,用新的構造方法來建立物件,你重複勞動了100次,假如採用工廠模式,你只用改一次:把建立工廠給改一下就好了。這就是工廠模式最簡單最直接的好處。
2.工廠模式的示例
下面是最常見的一個示範,其實它的原理就是面向物件中的多型+介面程式設計,雖然返回的都是Car型別,但是drive的時候會呼叫真正的例項中的對應方法。按照抽象類和介面的意義歸屬,Car應該被定義成抽象類,因為Benz、Bmw和Car的關係是繼承關係,而介面表示的一組行為。但是,為什麼這裡還要定義成介面,是因為Java和.NET不支援多繼承,如果繼承了Car,就無法繼承其他類,有時候業務需要必須繼承其他類,這個時候程式碼就不能用了。當然,C++中支援多繼承,因此可以在C++中使用抽象類,另外C++沒介面的概念,但你可以模擬介面。這裡只介紹簡單工廠模式,至於剩下兩種工廠模式,我覺得更沒有使用價值。
interface Car { void drive(); } class Benz implements Car { @Override public void drive() { System.out.println("drive Benz"); } } class Bmw implements Car { @Override public void drive() { System.out.println("drive Bmw"); } } class CarFactory { public static Car creator(String carType) { if (carType.equals("Benz")) { return new Benz(); } else if (carType.equals("Bmw")) { return new Bmw(); } else { throw new UnsupportedOperationException("car with type" + carType + " is not supported."); } } } public class A { public static void main(String args[]) { Car benz = CarFactory.creator("Benz"); benz.drive(); Car bmw = CarFactory.creator("Bmw"); bmw.drive(); } }
上述程式碼是沒啥用的,看一個實際使用的例子。下面這個工廠模式的意義在於能夠統一管理所有的業務管理器,僅此而已。
/**
* 管理器的工程,初始化所有業務的管理器
*/
public class ManagerFactory {
// 快取管理器例項的集合
private transient Map<Byte, IManager> mManagerMap = null;
private static ManagerFactory sIntance = new ManagerFactory();
private ManagerFactory() {
mManagerMap = new HashMap<Byte, IManager>();
}
public ManagerFactory getInstance() {
return sInstance;
}
/**
* 獲取管理器例項
*
* @param context 上下文
* @param id 管理器ID
* @return 管理器例項
*/
protected IManager getManager(final Context context, final byte id) {
IManager manager = mManagerMap.get(mId);
if (manager == null) {
switch (id) {
case DB_ID:
manager = new DBManager(context);
break;
case DOWNLOAD_ID:
manager = new DownloadManager(context);
break;
case NETWORK_ID:
manager = new NetworkManager();
break;
case IMAGE_ID:
manager = new ImageManager();
break;
default:
break;
}
mManagerMap.put(id, manager);
}
return manager;
}
}
工廠模式為什麼沒有太大價值
1.有利有弊
優點:將物件的建立統一起來便於維護和整體把控,對擴充套件開放,對修改封閉
缺點:耦合性提高,由於工廠類集中了所有例項的建立邏輯,違反了高內聚責任分配原則,將全部建立邏輯集中到了一個工廠類中,這種對條件的判斷和對具體產品型別的判斷交錯在一起,很難避免模組功能的蔓延,對系統的維護和擴充套件非常不利。
2.使用有限制
從工廠模式的示例可以看出:工廠模式需要類實現它的介面並且在業務內部存在明顯的繼承關係,比如汽車和賓士寶馬的關係。而繼承關係往往存在於模型之間,業務之間很難存在繼承關係,因此如果業務內部或者業務之間沒有這種顯式的繼承關係該咋辦?就算業務內部有繼承關係,各個業務交給你統一管理,這樣就會提高程式碼的耦合性,當建立邏輯複雜的時候,工廠方法就很複雜,容易產生干擾。
3.其開閉性優點很容易被替代
可以通過高度層次化和模組化來提高系統的開閉性,而不必生硬地去套用工廠模式。
相關推薦
【大話設計模式】——淺談設計模式基礎
表示 無用功 隱式 art -s -m 個人 pri one 初學設計模式給我最大的感受是:人類真是偉大啊!單單是設計模式的基礎課程就讓我感受到了強烈的生活氣息。個人感覺《大話設計模式》這本書寫的真好。讓貌似非常晦澀難懂的設計模式變的生活化。趣味化。 以下淺談一
海天味業談人工智慧的利與弊
隨著現代科學技術的飛速發展,先進的技術在各個領域都得到了廣泛的應用。人工智慧現在成為了相當火熱的技術,下面就為大家介紹一下人工智慧的利與弊。 人工智慧的利與弊 一、人工智慧技術的發展對我們的益處 1、商業價值很高 一般認為,人工智慧有三大商用方向:一是資訊聚合;二是評估使用者情緒
為什麼工廠模式是華而不實的—淺談工廠模式的利與弊
轉載請註明出處:http://blog.csdn.net/singwhatiwanna/article/details/17428923說明:博主虛心接受大家的抨擊,批評,指正前言我一直想介紹下工廠模式,我曾經搞過J2EE,用的是輕量級SSH框架,其中Spring有IOC概念
淺談設計模式之簡單工廠模式與策略模式
本文主要是關於面向物件程式設計(OOP)的設計模式,瞭解優秀軟體設計的演變過程比學習優秀的設計本身更有價值,因為設計演變的過程蘊藏著巨大的智慧,是一代一代程式設計師的思想的結晶。通過學習設計模式,設計出易於維護、擴充套件、複用以及靈活性好的程式;使用多型、繼承、
淺談設計模式——工廠模式
基本概念 工廠顧名思義就是建立產品。 該模式用於封裝和管理物件的建立,是一種建立型模式。 工廠模式一般分為3類: ① 簡單工廠模式(Simple Factory) ② 工廠方法模式(Factory Method) ③ 抽象工廠模式(Abstract Facto
設計模式之——淺談strategy模式(策略模式)
兩個 事情 操作 none 要去 編碼 淺談 一點 進行 strategy模式,即策略模式。個人覺得吧,策略模式更多的是一種思維方式。 首先我們要知道,為什麽需要策略模式。舉個例子,比如用程序輸出今天下午去玩什麽。 PlayGame 玩遊戲 package site.wa
(讓BAT的Offer不再難拿)淺談設計模式在iOS開發實戰項目中的應用
設計模式的 簡化 情況 結合 在線 百度 是個 開發 方案 在我們日常的開發中設計模式伴隨著項目的各個模塊,巧妙地使用設計模式可以讓我們寫出更高效,簡潔,優美的代碼。可是因為對於設計模式的不熟悉,很多高效的設計模式並沒有被很好地使用起來,現在包括曾經寫的一些代碼,然後在優化
淺談代理模式
頻繁 共享訪問 廣泛 間接 架構 創建 提供服務 執行命令 人員 代理模式用於構造具有解耦組件的分布式系統。這些組件可以通過遠程服務調用彼此交互。代理組件負責組件之間的通信協調。服務器將其功能(服務和特征)發布給代理。客戶端從代理請求服務,然後代理將客戶端重定向到其註冊中心
設計模式——個人淺談
生活 可能 每一個 可復用 封裝 總結 產品 運行 分布式 設計模式——個人淺談 1.什麽是設計模式 開篇先借用名人Christopher Alexander說過的一句話“每一個模式描述了一個在我們周圍不斷重復出現發生的問題,以及該問題的解決方案的核心。這樣,你就能一次又
淺談代理 模式與java中的動態代理
特殊 加工 依賴 mage 應用 主題 額外 我們 動態代理 代理模式的定義: 代理模式是一個使用律非常高的模式,定義如下: 為其他對象提供一種代理,以控制對這個對象的訪問。 類圖: 簡單的靜態代理: public interface IRunner{ //這是一個
淺談model1模式及使用model1模式來實現瀏覽商品
需要實現功能: 1.從資料庫中讀取各個商品的資訊 2.點選某個圖片會顯示商品的詳細資訊 3.在顯示商品頁面的右邊會顯示你最近瀏覽過的商品 效果圖: 使用model1模式來實現 1.需要實現資料庫連結的DBHelper類
原型模式(克隆模式):淺談淺克隆與深克隆
克隆是什麼?它的產生背景? 當new的物件是多例的時候,new物件將會不斷佔據記憶體。特別是消耗記憶體的大物件,比如資料庫連線等。平時運用的不多,只在spring等容器有見過,此處不多贅述,瞭解即可。 淺克隆與深克隆是什麼意思?通過案例逐步探討。 public class Star
淺談MVC模式——複合模式之王
檢視:用來呈現模型。通常需要從模型中取得它需要的狀態與資料。 控制器:取得使用者的輸入並解讀出其對模型的意思。 模型:持有所有的資料、狀態個程式邏輯。 使用者和檢視互動。檢視告訴控制器你做了什麼。控制器解讀你的動作並告知模型如何做出對應的動作,控制器也可能告知模型做出改變。模型改變時,會通知檢視。 &
淺談設計模式之原型模式
背景知識: 我們常說的設計模式其實是一種程式碼規範,遵從設計模式所編寫的程式碼並不是最高效的,但是是可維護的。 設計模式主要有三類:建立型設計模式,結構型設計模式以及行為型設計模式。 設計模式遵循的幾個原則:開閉原則,里氏代換原則,依賴倒轉原則,單一職責原則,合成複用原則,介面
淺談MVC模式
MVC模式 咳咳,下面就由我來給大家吹個5毛錢的mvc模式哈。 MVC模式主要用於應用程式的分層開發。這個是很棒棒噠,聽說發明這模式的那傢伙賺了好幾個億。。。(江湖傳言哈,別噴),整的我很是心動呀 Model(模型):模型代表一個存取
淺談設計模式
一、JS設計模式 單例模式 工廠模式 建構函式模式 原型模式 建構函式 + 原型模式 觀察者模式與訂閱釋出模式 策略模式 代理模式 二、什麼是設計模式? 設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、程式碼設計經驗
淺談TDD、BDD與ATDD軟體開發 (敏捷開發模式)
這些知識之前就瞭解了一點,還沒來得急總結,現在總結一下。 1. 首先了解一下這三個開發模式都是什麼意思: TDD:測試驅動開發(Test-Driven Development)測試驅動開發是敏捷開發中的一項核心實踐和技術,也是一種設計方法論。TDD的原理是在開發功能程式碼之
淺談單模式串字串匹配演算法(KMP)
字串演算法很有趣,尤其是KMP和AC自動機~~ 大綱 1.問題定義 字串匹配是電腦科學中最古老、研究最廣泛的問題之一。一個字串是一個定義在有限字母表∑上的字元序列。例如,ATCTAGAGA是字母表∑ = {A,C,G,T}上的一個字串。字串匹配問題就是在一個大的字串
Spring源碼分析 之淺談設計模式
throw rup change getheight 配置 owa 委派 bean 松耦合 一直想專門寫個Spring源碼的博客,工作了,可以全身性的投入到互聯網行業中。雖然加班很嚴重,但是依然很開心。趁著淩晨有時間,總結總結。 首先spring,相信大家都很熟悉了。
淺談思維模式與寫作
談談個人,剖析自己,從內在的自我出發,也許就不會迷茫 先談談自己寫作的問題吧,為什麼我會動手寫下這篇文章呢?原因有很多,簡單列兩條:一、之前制定的習慣:一週一篇技術部落格;二、剛剛看了一篇牛人的文章,覺得寫作是個人反思與成長很好的方式,感觸尤其大,所以