簡單工廠模式定義:java
簡單工廠設計模式又稱爲靜態工廠方法(Static Factory Method)模式,它屬於類建立型模式。在簡單工廠模式中,能夠根據參數的不一樣返回不一樣類的實例。簡單工廠模式專門定義一個類來負責建立其餘類的實例,被建立的實例一般都具備共同的父類。設計模式
簡單工廠主要分爲以下幾個角色ide
抽象產品(abstract product):爲全部具體產品的抽象表現,通常爲抽象類spa
具體產品(product):爲抽象產品的具體實現設計
生成產品工廠(factory):負責實現建立全部實例的內部邏輯code
具體類圖blog
Book 抽象產品繼承
ip
BookFactory:工廠類get
具體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(); } } }
該模式的優勢:
將類的建立縮小到factory類中進行,免除調用方對建立類時候的一個責任,
客戶端無需知道類名,只須要知道對應的參數便可
能夠在引入配置文件的基礎上,能夠無需改變代碼便可更換產品,實現靈活
該模式的缺點
全部類建立都創建在factory中進行,一旦該類出現了問題,則其餘的所依賴的類都沒法進行
系統擴展複雜,若是產品類型比較多的話,會致使factory中邏輯判斷會很是多,不利於系統維護和擴展
簡單工廠模式因爲使用了靜態工廠方法,形成工廠角色沒法造成基於繼承的等級結構
使用場景
負責建立的類的數量相對較少,因爲建立類的數量相對比較少,類的複雜性也就不會這麼高
客戶端建立類的時候,既不須要關心建立細節,甚至連類名都不須要記住,只須要知道類型所對應的參數。
應用
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; }