設(shè)計模式: Java中的工廠設(shè)計模式

原文鏈接

https://github.com/shellhub/blog/issues/22

前言

工廠設(shè)計模式(Factory Design Pattern)屬于創(chuàng)建模式之一票唆,工廠設(shè)計模式在JDK,Spring,Stuts被廣泛使用


factory-design-pattern

當(dāng)一個類或者接口有多個子類署照,并且基于輸入返回特定的子類,此時會使用工廠設(shè)計模式。這種模式負(fù)責(zé)從客戶端到工廠類的實例化惩琉。

讓我們首先學(xué)習(xí)如何在java中實現(xiàn)工廠設(shè)計模式态罪,然后我們將研究工廠模式的優(yōu)勢,我們將在JDK中看到一些工廠設(shè)計模式的使用微宝。請注意疮胖,此模式也稱為工廠方法設(shè)計模式。

工廠設(shè)計模式: 超類

工廠設(shè)計模式中的超類可以是接口设易,抽象類或普通的java類逗柴。對于我們的工廠設(shè)計模式示例,我們使用帶有重寫的toString()方法的抽象超類進(jìn)行測試顿肺。

package com.github.shellhub.model;

public abstract class Computer {

    public abstract String getRAM();
    public abstract String getHDD();
    public abstract String getCPU();

    @Override
    public String toString(){
        return "RAM= "+this.getRAM()+", HDD="+this.getHDD()+", CPU="+this.getCPU();
    }
}

工廠設(shè)計模式: 子類

假設(shè)我們有兩個子類PCServer戏溺,具有以下實現(xiàn)。

PC.java

package com.github.shellhub.model;

public class PC extends Computer {

    private String ram;
    private String hdd;
    private String cpu;

    public PC(String ram, String hdd, String cpu){
        this.ram=ram;
        this.hdd=hdd;
        this.cpu=cpu;
    }
    @Override
    public String getRAM() {
        return this.ram;
    }

    @Override
    public String getHDD() {
        return this.hdd;
    }

    @Override
    public String getCPU() {
        return this.cpu;
    }

}

Server.java

package com.github.shellhub.model;

public class Server extends Computer {

    private String ram;
    private String hdd;
    private String cpu;

    public Server(String ram, String hdd, String cpu){
        this.ram=ram;
        this.hdd=hdd;
        this.cpu=cpu;
    }
    @Override
    public String getRAM() {
        return this.ram;
    }

    @Override
    public String getHDD() {
        return this.hdd;
    }

    @Override
    public String getCPU() {
        return this.cpu;
    }

}

工廠類

既然現(xiàn)在我們準(zhǔn)備好了超類和子類屠尊,我們可以編寫工廠類旷祸。以下是基本的實現(xiàn)。

package com.github.shellhub.factory;

import com.github.shellhub.model.Computer;
import com.github.shellhub.model.PC;
import com.github.shellhub.model.Server;

public class ComputerFactory {

    public static Computer getComputer(String type, String ram, String hdd, String cpu) {
        if ("PC".equalsIgnoreCase(type)) {
            return new PC(ram, hdd, cpu);
        } else if ("Server".equalsIgnoreCase(type)) {
            return new Server(ram, hdd, cpu);
        }

        return null;
    }
}

使用

這是一個簡單的測試客戶端程序讼昆,它使用上面的工廠設(shè)計模式實現(xiàn)托享。

package com.github.shellhub;

import com.github.shellhub.factory.ComputerFactory;
import com.github.shellhub.model.Computer;

public class TestFactory {

    public static void main(String[] args) {
        Computer pc = ComputerFactory.getComputer("pc", "2 GB", "500 GB", "2.4 GHz");
        Computer server = ComputerFactory.getComputer("server", "16 GB", "1 TB", "2.9 GHz");
        System.out.println("Factory PC Config::" + pc);
        System.out.println("Factory Server Config::" + server);
    }

}

Output:

Factory PC Config::RAM= 2 GB, HDD=500 GB, CPU=2.4 GHz
Factory Server Config::RAM= 16 GB, HDD=1 TB, CPU=2.9 GHz

工廠設(shè)計模式的優(yōu)點(diǎn)

  • 工廠設(shè)計模式提供了接口而不是實現(xiàn)的代碼方法。
  • 工廠模式從客戶端代碼中刪除實際實現(xiàn)類的實例化浸赫。工廠模式使我們的代碼更健壯闰围,耦合更少,易于擴(kuò)展既峡。例如羡榴,我們可以輕松更改PC類實現(xiàn),因為客戶端程序不知道這一點(diǎn)运敢。
  • 工廠模式通過繼承提供實現(xiàn)和客戶端類之間的抽象校仑。

工廠設(shè)計模式在JDK中的應(yīng)用

  1. java.util.CalendarResourceBundleNumberFormat getInstanc()方法使用Factory模式传惠。
  2. 包裝類中的valueOf()方法迄沫,如BooleanInteger等卦方。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末羊瘩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌困后,老刑警劉巖乐纸,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衬廷,死亡現(xiàn)場離奇詭異摇予,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吗跋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門侧戴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人跌宛,你說我怎么就攤上這事酗宋。” “怎么了疆拘?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵蜕猫,是天一觀的道長。 經(jīng)常有香客問我哎迄,道長回右,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任漱挚,我火速辦了婚禮翔烁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘旨涝。我一直安慰自己蹬屹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布白华。 她就那樣靜靜地躺著慨默,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弧腥。 梳的紋絲不亂的頭發(fā)上厦取,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機(jī)與錄音鸟赫,去河邊找鬼蒜胖。 笑死,一個胖子當(dāng)著我的面吹牛抛蚤,可吹牛的內(nèi)容都是我干的台谢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼岁经,長吁一口氣:“原來是場噩夢啊……” “哼朋沮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤樊拓,失蹤者是張志新(化名)和其女友劉穎纠亚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筋夏,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蒂胞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了条篷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骗随。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赴叹,靈堂內(nèi)的尸體忽然破棺而出鸿染,到底是詐尸還是另有隱情,我是刑警寧澤乞巧,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布涨椒,位于F島的核電站,受9級特大地震影響绽媒,放射性物質(zhì)發(fā)生泄漏蚕冬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一些椒、第九天 我趴在偏房一處隱蔽的房頂上張望播瞳。 院中可真熱鬧,春花似錦免糕、人聲如沸赢乓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牌芋。三九已至,卻和暖如春松逊,著一層夾襖步出監(jiān)牢的瞬間躺屁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工经宏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留犀暑,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓烁兰,卻偏偏與公主長得像耐亏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子沪斟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

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

  • 參考資料:菜鳥教程之設(shè)計模式 設(shè)計模式概述 設(shè)計模式(Design pattern)代表了最佳的實踐广辰,通常被有經(jīng)驗...
    Steven1997閱讀 1,172評論 1 12
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法择吊,繼承相關(guān)的語法李根,異常的語法,線程的語...
    子非魚_t_閱讀 31,623評論 18 399
  • 什么時候我可以真正的發(fā)自內(nèi)心的几睛,微笑房轿,什么時候我可以真的放松一下自己,什么時候我可以再像以前那樣天真的什么都不去想枉长。
    兩寶的媽咪閱讀 59評論 0 0
  • 武淑貞 把美食做成花冀续,不僅好看琼讽,而且好吃必峰,這樣的美食不多見,今天我給大家介紹一下內(nèi)蒙的美食——燒麥的家常...
    春光明媚_f373閱讀 568評論 2 3
  • 買的時候的小側(cè)芽钻蹬,如今已經(jīng)慢慢長大啦吼蚁!
    卡蜜婭養(yǎng)肉ing閱讀 507評論 0 0