設(shè)計模式第3篇:工廠方法模式

本文翻譯自:https://www.journaldev.com/1392/factory-design-pattern-in-java

  • 工廠方法模式一種創(chuàng)建對象的模式,它被廣泛應(yīng)用在jdk中以及Spring和Struts框架中;
  • 工廠方法模式基于“輸入”花吟,應(yīng)用在超類和多個子類之間的情況懒震,這種模式將創(chuàng)建對象的責任轉(zhuǎn)移到工廠類趾诗;
  • 首先讓我們學習一下如何在Java中應(yīng)用工廠方法模式并且學習到工廠方法的優(yōu)點句旱,另外工廠方法模式也廣泛應(yīng)用在jdk中魄眉;
  • 超類可以是接口争占、抽象類燃逻、父類,本例中將通過重寫toString()方法來解釋工廠方法模式臂痕;
package com.journaldev.design.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();
    }
}

Factory Design Pattern Sub Classes

假設(shè)子類PC和Server實現(xiàn)了Computer:

package com.journaldev.design.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也實現(xiàn)了Computer:

package com.journaldev.design.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;
    }

}

Factory Class

現(xiàn)在有了多個子類和超類伯襟,接下來可以創(chuàng)建工廠類了:

package com.journaldev.design.factory;

import com.journaldev.design.model.Computer;
import com.journaldev.design.model.PC;
import com.journaldev.design.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;
    }
}

需要重點指出的是:

    1. 工廠類可以是單例的,getComputer可以是靜態(tài)的握童;
    1. getComputer是工廠類的方法姆怪,且基于相同的參數(shù)類型返回了不同的對象;

接下來是一個小case澡绩,用于測試工廠方法的效果:

package com.journaldev.design.test;

import com.journaldev.design.abstractfactory.PCFactory;
import com.journaldev.design.abstractfactory.ServerFactory;
import com.journaldev.design.factory.ComputerFactory;
import com.journaldev.design.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);
    }

}

輸出:

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

Factory Design Pattern Advantages

  • 面向接口編程片效,體現(xiàn)了面向?qū)ο蟮乃枷耄?/li>
  • 將創(chuàng)建對象的工作轉(zhuǎn)移到了工廠類;

Factory Design Pattern Examples in JDK

  • java.util.Calendar, ResourceBundle and NumberFormat getInstance() 使用了工廠方法模式英古;
  • valueOf() 在包裝類中淀衣,如Boolean, Integer 也使用了工廠方法模式;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末召调,一起剝皮案震驚了整個濱河市膨桥,隨后出現(xiàn)的幾起案子蛮浑,更是在濱河造成了極大的恐慌,老刑警劉巖只嚣,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沮稚,死亡現(xiàn)場離奇詭異,居然都是意外死亡册舞,警方通過查閱死者的電腦和手機蕴掏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來调鲸,“玉大人盛杰,你說我怎么就攤上這事∶晔” “怎么了即供?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長于微。 經(jīng)常有香客問我逗嫡,道長,這世上最難降的妖魔是什么株依? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任驱证,我火速辦了婚禮,結(jié)果婚禮上恋腕,老公的妹妹穿的比我還像新娘抹锄。我一直安慰自己,他們只是感情好吗坚,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布祈远。 她就那樣靜靜地躺著呆万,像睡著了一般商源。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谋减,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天牡彻,我揣著相機與錄音,去河邊找鬼出爹。 笑死庄吼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的严就。 我是一名探鬼主播总寻,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼梢为!你這毒婦竟也來了渐行?” 一聲冷哼從身側(cè)響起轰坊,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎祟印,沒想到半個月后肴沫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡蕴忆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年颤芬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片套鹅。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡站蝠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芋哭,到底是詐尸還是另有隱情沉衣,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布减牺,位于F島的核電站豌习,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拔疚。R本人自食惡果不足惜肥隆,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望稚失。 院中可真熱鬧栋艳,春花似錦、人聲如沸句各。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凿宾。三九已至矾屯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間初厚,已是汗流浹背件蚕。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留产禾,地道東北人排作。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像亚情,于是被迫代替她去往敵國和親妄痪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

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

  • 設(shè)計模式匯總 一楞件、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用衫生、多...
    MinoyJet閱讀 3,948評論 1 15
  • 簡單工廠模式雖然簡單僧著,但存在一個很嚴重的問題。當系統(tǒng)中需要引入新產(chǎn)品時障簿,由于靜態(tài)工廠方法通過所傳入?yún)?shù)的不同來創(chuàng)建...
    justCode_閱讀 1,190評論 1 9
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理盹愚,服務(wù)發(fā)現(xiàn),斷路器站故,智...
    卡卡羅2017閱讀 134,701評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法皆怕,類相關(guān)的語法,內(nèi)部類的語法西篓,繼承相關(guān)的語法愈腾,異常的語法,線程的語...
    子非魚_t_閱讀 31,663評論 18 399
  • 一個UML類圖 類之間的關(guān)系 類的繼承結(jié)構(gòu)表現(xiàn)在UML中為:泛化(generalize)與實現(xiàn)(realize) ...
    僚機KK閱讀 647評論 0 0