Java設(shè)計(jì)模式--簡(jiǎn)單工廠模式Factory

應(yīng)用場(chǎng)景

簡(jiǎn)單工廠模式又叫做靜態(tài)工廠方法(StaticFactoryMethod)模式馒索,但不屬于23種設(shè)計(jì)模式之一曹体。簡(jiǎn)單工廠模式的實(shí)質(zhì)是由一個(gè)工廠類根據(jù)傳入的參數(shù)嫌吠,動(dòng)態(tài)決定應(yīng)該創(chuàng)建哪一個(gè)產(chǎn)品類匾竿。

Spring中的BeanFactory就是簡(jiǎn)單工廠模式的體現(xiàn)砌烁,根據(jù)傳入一個(gè)唯一的標(biāo)識(shí)來獲得Bean對(duì)象,但是否是在傳入?yún)?shù)后創(chuàng)建還是傳入?yún)?shù)前創(chuàng)建這個(gè)要根據(jù)具體情況來定姑原。

歸類

創(chuàng)建型模式

特點(diǎn)

是復(fù)雜工廠模式的思維模型

窮舉

批量生產(chǎn)悬而、標(biāo)準(zhǔn)化

簡(jiǎn)單工廠模式定義

簡(jiǎn)單工廠模式(Simple Factory Pattern):定義一個(gè)工廠類,它可以根據(jù)參數(shù)的不同返回不同類的實(shí)例页衙,被創(chuàng)建的實(shí)例通常都具有共同的父類摊滔。因?yàn)樵诤?jiǎn)單工廠模式中用于創(chuàng)建實(shí)例的方法是靜態(tài)(static)方法,因此簡(jiǎn)單工廠模式又被稱為靜態(tài)工廠方法(Static Factory Method)模式店乐,它屬于類創(chuàng)建型模式。

簡(jiǎn)單工廠模式結(jié)構(gòu)圖

簡(jiǎn)單工廠結(jié)構(gòu)圖.png

從簡(jiǎn)單工廠結(jié)構(gòu)圖中我們可以看出它包含三個(gè)角色:


圖片.png
  1. Product (抽象產(chǎn)品角色):

它是工廠類所創(chuàng)建的所有對(duì)象的父類呻袭,封裝了各種產(chǎn)品對(duì)象的公有方法眨八,它的引入將提高系統(tǒng)的靈活性,使得在工廠類中只需定義一個(gè)通用的工廠方法左电,因?yàn)樗袆?chuàng)建的具體產(chǎn)品對(duì)象都是其子類對(duì)象廉侧。抽象產(chǎn)品可以使用接口和抽象類來來實(shí)現(xiàn)。

  1. ConcreteProduct (具體產(chǎn)品角色):

它是簡(jiǎn)單工廠模式的創(chuàng)建目標(biāo)篓足,所有被創(chuàng)建的對(duì)象都充當(dāng)這個(gè)角色的某個(gè)具體類的實(shí)例段誊。每一個(gè)具體產(chǎn)品角色都繼承了抽象產(chǎn)品角色,需要實(shí)現(xiàn)在抽象產(chǎn)品中聲明的抽象方法栈拖。在簡(jiǎn)單工廠模式中连舍,客戶端通過工廠類來創(chuàng)建一個(gè)產(chǎn)品類的實(shí)例,而無須直接使用new關(guān)鍵字來創(chuàng)建對(duì)象涩哟,它是工廠模式家族中最簡(jiǎn)單的一員索赏。 在使用簡(jiǎn)單工廠模式時(shí),首先需要對(duì)產(chǎn)品類進(jìn)行重構(gòu)贴彼,不能設(shè)計(jì)一個(gè)包羅萬象的產(chǎn)品類潜腻,而需根據(jù)實(shí)際情況設(shè)計(jì)一個(gè)產(chǎn)品層次結(jié)構(gòu),將所有產(chǎn)品類公共的代碼移至抽象產(chǎn)品類器仗,并在抽象產(chǎn)品類中聲明一些抽象方法融涣,以供不同的具體產(chǎn)品類來實(shí)現(xiàn)。

  1. Factory (工廠角色):

這個(gè)角色就是工廠類,他是工廠模式的核心威鹿,負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有產(chǎn)品實(shí)例的內(nèi)部邏輯妓盲;工廠類可以被外界直接調(diào)用,創(chuàng)建所需的產(chǎn)品對(duì)象专普;在工廠類中提供了靜態(tài)的工廠方法factoryMethod()悯衬,它的返回類型為抽象產(chǎn)品類型Product。

簡(jiǎn)單工廠舉例

比如我有蘋果檀夹、桔子筋粗、等水果,然后有一個(gè)榨汁機(jī)炸渡,我給一個(gè)蘋果就給我榨出蘋果汁娜亿,給桔子就出桔汁。

在這個(gè)例子中蚌堵,果汁就是我們的產(chǎn)品买决,而蘋果汁,桔子汁就是我們的具體的產(chǎn)品吼畏,榨汁機(jī)就是我們的工廠,而蘋果督赤,桔子等水果就是我們輸送的原材料.

榨汁機(jī)工廠的 UML 圖

榨汁機(jī)工廠的 UML 圖.png

1、定義抽象產(chǎn)品果汁接口IJuice.java

/**
 * @Description 創(chuàng)建一個(gè)果汁接口
 */
public interface IJuice {
    String getName() ;
    //也可以聲明一些其它的業(yè)務(wù)方法
}

2泻蚊、定義具體的產(chǎn)品躲舌,蘋果汁「AppleJuice.java」,桔汁「OrangeJuice.java

# AppleJuice.java

/**
 * @Description 一個(gè)具體的產(chǎn)品--- 蘋果汁
 */
public class AppleJuice implements IJuice {

    public static final String TAG = "AppleJuice" ;

    @Override
    public String getName() {
        Log.e(TAG,"我是蘋果汁") ;
        return "我是蘋果汁";
    }
}

# OrangeJuice.java

/**
 * @Description 具體的產(chǎn)品桔子汁
 */
public class OrangeJuice implements IJuice {

    public static final String TAG = "OrangeJuice" ;

    @Override
    public String getName() {
        Log.e(TAG,"我是桔子汁") ;
        return "我是桔子汁";
    }
}

3性雄、創(chuàng)建榨汁機(jī)「工廠類」 JuiceFactory.java


/**
 * @Description  果汁機(jī)---工廠
 */
public class JuiceFactory {

    /**
     * 根據(jù)名稱來生產(chǎn)不同的果汁
     * @param name
     * @return
     */
    public static IJuice createJuice(String name){
        IJuice iJuice = null;
        if(name.equals("apple")){
            //蘋果汁
            iJuice = new AppleJuice() ;
        }else if(name.equals("orange")){
            //桔子汁
            iJuice = new OrangeJuice() ;
        }

        return iJuice ;
    }
}

4没卸、使用

    public String create(int type) {
         IJuice juice = null;
        switch (type){
            case 1:
                juice  = JuiceFactory.createJuice("apple") ;
                break ;
            case 2:
               juice  = JuiceFactory.createJuice("orange") ;
                break ;
            default:
                break ;
        }
      return juice .getName();
    }

 public static void main(String[] args) {
      String name =  create(1);
      System.out.println(name);
  }

簡(jiǎn)單工廠模式的優(yōu)點(diǎn)

  1. 工廠類含有必要的判斷邏輯,可以決定在什么時(shí)候創(chuàng)建哪一個(gè)產(chǎn)品類的實(shí)例秒旋,客戶端可以免除直接創(chuàng)建產(chǎn)品對(duì)象的責(zé)任约计,客戶程序不需要產(chǎn)品的具體生產(chǎn)細(xì)節(jié);簡(jiǎn)單工廠模式通過這種做法實(shí)現(xiàn)了對(duì)責(zé)任的分割迁筛,它提供了專門的工廠類用于創(chuàng)建對(duì)象煤蚌。
  2. 客戶端無須知道所創(chuàng)建的具體產(chǎn)品類的類名,只需要知道具體產(chǎn)品類所對(duì)應(yīng)的參數(shù)即可瑰煎,不需要知道產(chǎn)品是怎么創(chuàng)建的铺然。
  3. 通過引入配置文件,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產(chǎn)品類酒甸,在一定程度上提高了系統(tǒng)的靈活性魄健。
  4. 簡(jiǎn)單工廠將創(chuàng)建產(chǎn)品的職責(zé)放在了單獨(dú)的靜態(tài)工廠中去處理和維護(hù)一定長(zhǎng)度上體現(xiàn)了SRP原則

簡(jiǎn)單工廠模式的缺點(diǎn)

  1. 由于工廠類集中了所有產(chǎn)品創(chuàng)建邏輯插勤,一旦不能正常工作沽瘦,整個(gè)系統(tǒng)都要受到影響革骨。
  2. 使用簡(jiǎn)單工廠模式將會(huì)增加系統(tǒng)中具體產(chǎn)品類的個(gè)數(shù),在一定程序上增加了系統(tǒng)的復(fù)雜度和理解難度析恋。
  3. 系統(tǒng)擴(kuò)展困難良哲,一旦添加新產(chǎn)品就不得不修改工廠邏輯,在產(chǎn)品類型較多時(shí)助隧,有可能造成工廠邏輯過于復(fù)雜筑凫,不利于系統(tǒng)的擴(kuò)展和維護(hù)。
  4. 由于在增加新的產(chǎn)品的時(shí)候簡(jiǎn)單工廠模式必須要修改靜態(tài)的工廠方法并村,所以它違背了OCP原則巍实。

工廠模式的使用場(chǎng)景

在以下情況下可以使用簡(jiǎn)單工廠模式:

  1. 工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少:由于創(chuàng)建的對(duì)象較少,不會(huì)造成工廠方法中的業(yè)務(wù)邏輯太過復(fù)雜哩牍。
  2. 客戶端只知道傳入工廠類的參數(shù)棚潦,對(duì)于如何創(chuàng)建對(duì)象不關(guān)心:客戶端既不需要關(guān)心創(chuàng)建細(xì)節(jié),甚至連類名都不需要記住膝昆,只需要知道類型所對(duì)應(yīng)的參數(shù)丸边。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市荚孵,隨后出現(xiàn)的幾起案子妹窖,更是在濱河造成了極大的恐慌,老刑警劉巖处窥,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘱吗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡滔驾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門俄讹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哆致,“玉大人,你說我怎么就攤上這事患膛√В” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵踪蹬,是天一觀的道長(zhǎng)胞此。 經(jīng)常有香客問我,道長(zhǎng)跃捣,這世上最難降的妖魔是什么漱牵? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮疚漆,結(jié)果婚禮上酣胀,老公的妹妹穿的比我還像新娘刁赦。我一直安慰自己,他們只是感情好闻镶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布甚脉。 她就那樣靜靜地躺著,像睡著了一般铆农。 火紅的嫁衣襯著肌膚如雪牺氨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天墩剖,我揣著相機(jī)與錄音猴凹,去河邊找鬼。 笑死涛碑,一個(gè)胖子當(dāng)著我的面吹牛精堕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒲障,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼歹篓,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了揉阎?” 一聲冷哼從身側(cè)響起庄撮,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎毙籽,沒想到半個(gè)月后洞斯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坑赡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年烙如,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毅否。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亚铁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出螟加,到底是詐尸還是另有隱情徘溢,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布捆探,位于F島的核電站然爆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏黍图。R本人自食惡果不足惜曾雕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雌隅。 院中可真熱鬧翻默,春花似錦缸沃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至肯污,卻和暖如春翘单,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹦渣。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工哄芜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柬唯。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓认臊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親锄奢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子失晴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容