1. 程式人生 > >為什麼工廠模式是華而不實的—淺談工廠模式的利與弊

為什麼工廠模式是華而不實的—淺談工廠模式的利與弊

轉載請註明出處: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、BDDATDD軟體開發 (敏捷開發模式)

這些知識之前就瞭解了一點,還沒來得急總結,現在總結一下。 1. 首先了解一下這三個開發模式都是什麼意思: TDD:測試驅動開發(Test-Driven Development)測試驅動開發是敏捷開發中的一項核心實踐和技術,也是一種設計方法論。TDD的原理是在開發功能程式碼之

模式串字串匹配演算法(KMP)

字串演算法很有趣,尤其是KMP和AC自動機~~ 大綱 1.問題定義 字串匹配是電腦科學中最古老、研究最廣泛的問題之一。一個字串是一個定義在有限字母表∑上的字元序列。例如,ATCTAGAGA是字母表∑ = {A,C,G,T}上的一個字串。字串匹配問題就是在一個大的字串

Spring源碼分析 之設計模式

throw rup change getheight 配置 owa 委派 bean 松耦合 一直想專門寫個Spring源碼的博客,工作了,可以全身性的投入到互聯網行業中。雖然加班很嚴重,但是依然很開心。趁著淩晨有時間,總結總結。 首先spring,相信大家都很熟悉了。

思維模式寫作

談談個人,剖析自己,從內在的自我出發,也許就不會迷茫 先談談自己寫作的問題吧,為什麼我會動手寫下這篇文章呢?原因有很多,簡單列兩條:一、之前制定的習慣:一週一篇技術部落格;二、剛剛看了一篇牛人的文章,覺得寫作是個人反思與成長很好的方式,感觸尤其大,所以