設(shè)計模式之簡單工廠模式

簡單工廠模式又稱靜態(tài)工廠模式腕铸,是創(chuàng)建型模式

定義

簡單工廠模式的實質(zhì)是由一個工廠類根據(jù)傳入的參數(shù)实辑,動態(tài)決定應該創(chuàng)建哪一個產(chǎn)品類(這些產(chǎn)品類繼承自一個父類或接口)的實例不从。(摘自百度百科)

角色
  • 工廠:工廠類擁有一個抽象產(chǎn)品類的引用以及一個創(chuàng)建產(chǎn)品類的工廠方法浊洞,根據(jù)客戶端傳入的參數(shù)生產(chǎn)不同的產(chǎn)品
  • 抽象產(chǎn)品(即工廠中抽象類):是所有產(chǎn)品的父類
  • 具體產(chǎn)品類:繼承抽象產(chǎn)品類牵敷。
UML類圖
簡單工廠模式UML類圖
代碼
  • Operation.java
public abstract class Operation {
    public Long numberA;
    public Long numberB;
    public abstract long getResult();
}
  • AddOperation.java
public class AddOperation extends Operation {
    @Override
    public long getResult() {
        return numberA + numberB;
    }
}
  • SubOperation.java
public class SubOperation extends Operation {
    @Override
    public long getResult() {
        return numberA - numberB;
    }
}
  • MulOperation.java
public class MulOperation extends Operation {
    @Override
    public long getResult() {
        return numberA * numberB;
    }
}
  • DivOperation.java
public class DivOperation extends Operation {
    @Override
    public long getResult() {
        if(numberB == 0){
            throw new RuntimeException("除數(shù)不能為零");
        }
        return numberA/numberB;
    }
}
  • SimpleFactory.java
    public static Operation create(String operation){
        Operation op = null;
        switch (operation){
            case "+":
                op = new AddOperation();
                break;
            case "-":
                op = new SubOperation();
                break;
            case "*":
                op = new MulOperation();
                break;
            case "/":
                op = new DivOperation();
                break;
            default:
                break;
        }
        return op;
    }
}
  • ClientTest.java
public class ClientTest {
    public static void main(String[] args) {
        Operation operation = SimpleFactory.create("+");
        operation.numberA = 10L;
        operation.numberB = 20L;
        long result = operation.getResult();
        System.out.println(result);
    }
}
優(yōu)點

工廠類是關(guān)鍵,負責產(chǎn)品的生產(chǎn)(即對象的創(chuàng)建)法希,客戶端只要傳入相應的參數(shù)就能得到相應的產(chǎn)品枷餐,而不要管產(chǎn)品是如何創(chuàng)建的。

缺點

所有產(chǎn)品的創(chuàng)建都是由工廠類進行創(chuàng)建的苫亦,只能創(chuàng)建事先考慮到的產(chǎn)品毛肋,如果要新加產(chǎn)品的話,就需要的改動工廠類

使用場景
  • 工廠類負責創(chuàng)建的對象比較少
  • 客戶端不關(guān)心產(chǎn)品的生產(chǎn)過程屋剑,只要傳入相應的參數(shù)得到產(chǎn)品
  • 由于簡單工廠很容易違反高內(nèi)聚責任分配原則润匙,因此一般只在很簡單的情況下使用

利用反射機制來改進簡單工廠模式

因為現(xiàn)有的簡單工廠模式每次新加一個產(chǎn)品,都要新建一個產(chǎn)品類以及在工廠類中加上一個switch唉匾,顯得有些繁瑣孕讳,所以就用反射來改進

改進后的工廠和客戶端的代碼如下
  • UseReflectSimpleFactory.java
public class UseReflectSimpleFactory {
    public static Operation create(Class<? extends Operation> clazz){
        Operation operation = null;
        try {
            operation = clazz.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return operation;
    }
}
  • UseReflectClientTest.java
public class UseReflectClientTest {
    public static void main(String[] args) {
        Operation operation =
 UseReflectSimpleFactory.create(DivOperation.class);
        operation.numberA = 100L;
        operation.numberB = 10L;
        System.out.println(operation.getResult());
    }
}

改進的工廠方法傳一個Class對象,而不是一個產(chǎn)品類的路徑的原因是避免客戶端寫錯了路徑而導致實例化產(chǎn)品失敗的情況

------------------------------------END-------------------------------------------

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巍膘,一起剝皮案震驚了整個濱河市厂财,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌峡懈,老刑警劉巖璃饱,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逮诲,居然都是意外死亡帜平,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門梅鹦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裆甩,“玉大人,你說我怎么就攤上這事齐唆∴退ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長茉帅。 經(jīng)常有香客問我叨叙,道長,這世上最難降的妖魔是什么堪澎? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任擂错,我火速辦了婚禮,結(jié)果婚禮上樱蛤,老公的妹妹穿的比我還像新娘钮呀。我一直安慰自己,他們只是感情好昨凡,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布爽醋。 她就那樣靜靜地躺著,像睡著了一般便脊。 火紅的嫁衣襯著肌膚如雪蚂四。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天哪痰,我揣著相機與錄音遂赠,去河邊找鬼。 笑死妒御,一個胖子當著我的面吹牛解愤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乎莉,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼送讲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惋啃?” 一聲冷哼從身側(cè)響起哼鬓,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎边灭,沒想到半個月后异希,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡绒瘦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年称簿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惰帽。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡憨降,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出该酗,到底是詐尸還是另有隱情授药,我是刑警寧澤士嚎,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站悔叽,受9級特大地震影響莱衩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜娇澎,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一笨蚁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧九火,春花似錦赚窃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽是掰。三九已至虑鼎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間键痛,已是汗流浹背炫彩。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留絮短,地道東北人江兢。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像丁频,于是被迫代替她去往敵國和親杉允。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

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