簡單工廠模式

原文連接:java

http://tianweili.github.com/blog/2015/03/08/simple-factory-pattern/git

介紹

簡單工廠模式屬於建立型模式,又叫作靜態工廠方法(static factory method)。可是它並無歸爲23種GOF設計模式其中。github

簡單工廠模式是由工廠對象來決定建立哪種產品類的實例設計模式

簡單說就是工廠對象根據傳入的參數,動態的決定建立哪種產品類的實例,而這些產品類繼承自一個父類或一個接口。ide

UML類圖

簡單工廠模式的一個基本的UML類圖以下所示:優化

{% img /simple-factory-patternsimple-factory-uml.png %}設計

在這個UML類圖中包含如下角色:code

工廠(Factory)對象

這是簡單工廠模式的核心,由它來負責實現建立全部實例的邏輯。工廠對象用來被外界調用,根據傳入的參數來決定建立哪個產品對象。blog

抽象產品(Abstract Product)

抽象類或接口。是全部具體產品對象的父類,由它來定義全部具體產品的公共接口。

具體產品(Concrete Product)

具體產品是簡單工廠模式的建立目標,全部建立的對象都是某個具體產品類的實例。

代碼示例

public interface Product {
    public void function();
}
public class ProductA implements Product{
    @Override
    public void function() {
        System.out.println("ProductA function ...");
    }
}
public class ProductB implements Product{
    @Override
    public void function() {
        System.out.println("ProductB function ...");
    }
}
public class Factory {
    public Product create(String productName) {
        if (productName == null || "".equals(productName)) {
            return null;
        }
        if ("productA".equals(productName)) {
            return new ProductA();
        } else if ("productB".equals(productName)) {
            return new ProductB();
        }
        return null;
    }
}
public class Main {
    public static void main(String[] args) {
        Factory factory = new Factory();
        Product product1 = factory.create("productA");
        Product product2 = factory.create("productB");
        product1.function();
        product2.function();
    }
}

輸出結果:

ProductA function ...
ProductB function ...

優勢

客戶類和工廠類分開。消費者任什麼時候候須要某種產品,只需向工廠請求便可。消費者無須修改就能夠接納新產品。

外界不用關注對象建立邏輯,產品對象具體的建立過程由工廠來實現。外界直接給定信息來決定建立哪一個產品對象。

明確了各自的職責,有利於整個軟件體系結構的優化。

缺點

違反高內聚責任分配原則,將全部的建立邏輯都集中在了工廠類身上。

若是須要添加新的產品類,則須要修改工廠類。

當產品類不斷增多,工廠類對產品類型的判斷條件過多交織在了一塊兒,會形成邏輯過於複雜,對系統的擴展和維護不利。

使用場景

工廠類建立的產品對象比較少。

外界只須要傳入工廠類參數來得到產品對象,對於產品對象的建立過程不關心。

簡單工廠模式很容易違反高內聚責任分配原則,因此只是在一些很簡單的狀況下使用。

應用實例

附件的解壓

在工做中,有一個項目模塊中要求的功能是:登陸郵箱,獲取郵件,而後抓取郵件中的附件,下載下來,若是是壓縮包,則進行解壓,而後進行相應處理。在解壓時就用到了簡單工廠模式。附件壓縮包格式不一,有zip,rar等格式,則把每一種格式的解壓和處理都放到一個產品對象中,而後使用一個工廠類來決定建立哪個產品進行相應的處理。

因爲這個壓縮包解壓方式並很少,判斷邏輯並不太複雜,因此也不必用工廠方法模式,增長代碼複雜度。

做者:李天煒

原文連接:http://tianweili.github.com/blog/2015/03/08/simple-factory-pattern/

轉載請註明做者和文章出處,謝謝。

相關文章
相關標籤/搜索