設計模式學習(二)-簡單工廠模式

 

簡單工廠設計模式

  1. 簡單工廠模式定義:java

    簡單工廠設計模式又稱爲靜態工廠方法(Static Factory Method)模式,它屬於類建立型模式。在簡單工廠模式中,能夠根據參數的不一樣返回不一樣類的實例。簡單工廠模式專門定義一個類來負責建立其餘類的實例,被建立的實例一般都具備共同的父類。設計模式

  1. 簡單工廠主要分爲以下幾個角色ide

    1. 抽象產品(abstract product):爲全部具體產品的抽象表現,通常爲抽象類spa

    2. 具體產品(product):爲抽象產品的具體實現設計

    3. 生成產品工廠(factory):負責實現建立全部實例的內部邏輯code

  2. 具體類圖blog

    1. Book 抽象產品繼承

    2. ChineseBook,EnglishBook具體產品ip

    3. BookFactory:工廠類get

     

  3. 具體Java實現

    package cn.lonecloud.pattern.creational.simplefactory;
    ​
    /**
     * @author lonecloud
     * @version v1.0
     * @Package cn.lonecloud.pattern.creational.simplefactory
     * @Description: TODO
     * @date 2018/12/2下午12:09
     */
    public class BookFactory {
    ​
        public static Book getBook(String name){
            if ("english".equals(name)){
                return new EnglishBook();
            }else {
                return new ChineseBook();
            }
        }
    }
    ​
    

      

  4. 該模式的優勢:

    1. 將類的建立縮小到factory類中進行,免除調用方對建立類時候的一個責任,

    2. 客戶端無需知道類名,只須要知道對應的參數便可

    3. 能夠在引入配置文件的基礎上,能夠無需改變代碼便可更換產品,實現靈活

  5. 該模式的缺點

    1. 全部類建立都創建在factory中進行,一旦該類出現了問題,則其餘的所依賴的類都沒法進行

    2. 系統擴展複雜,若是產品類型比較多的話,會致使factory中邏輯判斷會很是多,不利於系統維護和擴展

    3. 簡單工廠模式因爲使用了靜態工廠方法,形成工廠角色沒法造成基於繼承的等級結構

  6. 使用場景

    1. 負責建立的類的數量相對較少,因爲建立類的數量相對比較少,類的複雜性也就不會這麼高

    2. 客戶端建立類的時候,既不須要關心建立細節,甚至連類名都不須要記住,只須要知道類型所對應的參數。

  7. 應用

    1. Calendar中的使用

        
    private static Calendar createCalendar(TimeZone zone,
                                               Locale aLocale)
        {
            CalendarProvider provider =
                LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale)
                                     .getCalendarProvider();
            if (provider != null) {
                try {
                    return provider.getInstance(zone, aLocale);
                } catch (IllegalArgumentException iae) {
                    // fall back to the default instantiation
                }
            }
    ​
            Calendar cal = null;
    ​
            if (aLocale.hasExtensions()) {
                String caltype = aLocale.getUnicodeLocaleType("ca");
                if (caltype != null) {
                    switch (caltype) {
                    case "buddhist":
                    cal = new BuddhistCalendar(zone, aLocale);
                        break;
                    case "japanese":
                        cal = new JapaneseImperialCalendar(zone, aLocale);
                        break;
                    case "gregory":
                        cal = new GregorianCalendar(zone, aLocale);
                        break;
                    }
                }
            }
            if (cal == null) {
                if (aLocale.getLanguage() == "th" && aLocale.getCountry() == "TH") {
                    cal = new BuddhistCalendar(zone, aLocale);
                } else if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja"
                           && aLocale.getCountry() == "JP") {
                    cal = new JapaneseImperialCalendar(zone, aLocale);
                } else {
                    cal = new GregorianCalendar(zone, aLocale);
                }
            }
            return cal;
        }
    
相關文章
相關標籤/搜索