設計模式(Java語言)- 簡單工廠模式

  簡單工廠模式有稱為靜態工廠模式,屬於設計模式中的創建型模式。簡單工廠模式通過對外提供一個靜態方法來統一為類創建實例。簡單工廠模式的目的是實現類與類之間解耦,其次是客戶端不需要知道這個對象是如何被穿創建出來的,只需要調用簡單工廠模式的方法來統一創建就可以了,從而明確了各個類的職責。

  一、創建簡單工廠模式的步驟

  第一步:聲明一個抽象類(接口),以及對應的抽象方法,由實現類分別去實現這個方法。

  第二步: 創建具體實現類,實現抽象方法。

  第三步:創建一個簡單工廠類,聲明一個靜態方法,根據傳入的不同的類型來確定創建抽象類的具體實現類。

  第四步:客戶端通過工廠類獲取實例對象。

 

  二、應用案例: 

  下面以製造手機為例子,在現實生活中可能有很多工廠可以創建不同品牌的手機,這些工廠可以根據不同的需求來創建不同的手機。根據上面的步驟,首先我們需要一個抽象類,所以我們需要知道不同品牌的手機其實都是屬於手機這種類別,因此我們可以將手機抽出來做成一個抽象類:

/**
 * 手機類
 */
public interface Phone {
    //製造手機的方法,留給具體的實現類來製造
    void create();
}

  第二步我們需要開始製造不同品牌的手機了:

  製造華為手機

public class Huawei implements Phone {
    @Override
    public void create() {
        System.out.println("====正在製造華為手機======");
    }
}

  蘋果手機

public class Iphone implements Phone {
    @Override
    public void create() {
        System.out.println("====正在製造蘋果手機======");
    }
}

  第三步我們需要創建一個工廠方法,返回手機類。具體製造什麼品牌的手機,需要根據傳進來的手機名字來決定,因此我們可以這麼寫:

public class SimpleFactory {

    public static Phone createPhone(String name) {
        if ("huawei".equals(name))
            return new Huawei();
        else
            return new Iphone();

    }

}

  第四步,手機創建好了,我們就可以使用了,即客戶端調用工廠方法創建對象實例

public class Client {

public static void main(String[] args) {
Phone huawei = SimpleFactory.createPhone("huawei");
huawei.create();

Phone iphone = SimpleFactory.createPhone("iphone");
iphone.create();
}

}

//輸出結果

====正在製造華為手機======
====正在製造蘋果手機======

  到這裏,簡單工廠模式基本已經寫完了,仔細看會發現這種方法創建對象違反了ocp原則,每次增加不同品牌手機的時候都需要在工廠方法里添加不同的條件判斷。如果手機品牌越來越多,代碼看起來非常臃腫,很不利於後期的代碼維護。因此,我們改進一下,不要通過手機品牌名稱來判斷需要創建哪一中對象了,而是客戶端想要創建什麼對象,只需要傳入具體的實現類就可以了,然後通過Java的反射來創建對象。

public class SimpleFactory2 {

    public static Phone create(Class<? extends Phone> clazz) {
        try {
            return clazz.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

}

  客戶端調用

public class Client {

    public static void main(String[] args) {
        Phone huawei = SimpleFactory2.create(Huawei.class);
        huawei.create();

        Phone iphone = SimpleFactory2.create(Iphone.class);
        iphone.create();
    }

}
//運行結果

====正在製造華為手機======
====正在製造蘋果手機======

  經過修改之後,每次增加新的手機品牌時就不用修改工廠方法的邏輯了。但是,還是有一個問題,就是每次創建對象都是通過反射來創建的,所以在性能上是有一定的損耗的。

 

  三、總結:

  優點:

    1、簡單優化了軟件體繫結構,明確了各自功能模塊的職責和權利

    2、通過工廠類,外界不需要直接創建具體產品對象,只需要負責消費,不需要關心內部如何創建對象

  缺點:

    1、改進前的簡單工廠模式全部創建邏輯都集中在一個工廠類中,能創建的類只能是考慮到的,如果需要添加新的類,就必須改變工廠類了

    2、改進前的簡單工廠模式隨着具體產品的不斷增多,可能會出現共產類根據不同條件創建不同實例的需求,這種對條件的判斷和對具體產品類型的判斷交錯在一起,很難避免功能模塊的蔓延,對系統的維護和擴展不利

    3、改進后的簡單工廠模式主要是使用反射效率會低一些

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步”網站設計“幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※試算大陸海運運費!

您可能也會喜歡…