工廠方法模式

1傍妒、定義

工廠方法模式(FACTORY METHOD)是一種常用的類創(chuàng)建型設(shè)計(jì)模式,此模式的核心精神是封裝類中變化的部分,提取其中個(gè)性化善變的部分為獨(dú)立類既忆,通過(guò)依賴注入以達(dá)到解耦、復(fù)用和方便后期維護(hù)拓展的目的患雇。它的核心結(jié)構(gòu)有四個(gè)角色宇挫,分別是抽象工廠;具體工廠器瘪;抽象產(chǎn)品;具體產(chǎn)品

2援所、模式簡(jiǎn)介

工廠方法(Factory Method)模式的意義是定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠接口欣除,將實(shí)際創(chuàng)建工作推遲到子類當(dāng)中。核心工廠類不再負(fù)責(zé)產(chǎn)品的創(chuàng)建滔岳,這樣核心類成為一個(gè)抽象工廠角色挽牢,僅負(fù)責(zé)具體工廠子類必須實(shí)現(xiàn)的接口,這樣進(jìn)一步抽象化的好處是使得工廠方法模式可以使系統(tǒng)在不修改具體工廠角色的情況下引進(jìn)新的產(chǎn)品。

工廠方法模式是簡(jiǎn)單工廠模式的衍生睹簇,解決了許多簡(jiǎn)單工廠模式的問(wèn)題太惠。首先完全實(shí)現(xiàn)‘開(kāi)-閉 原則’,實(shí)現(xiàn)了可擴(kuò)展凿渊。其次更復(fù)雜的層次結(jié)構(gòu)缚柳,可以應(yīng)用于產(chǎn)品結(jié)果復(fù)雜的場(chǎng)合秋忙。

工廠方法模式對(duì)簡(jiǎn)單工廠模式進(jìn)行了抽象构舟。有一個(gè)抽象的Factory類(可以是抽象類和接口),這個(gè)類將不再負(fù)責(zé)具體的產(chǎn)品生產(chǎn)弹澎,而是只制定一些規(guī)范努咐,具體的生產(chǎn)工作由其子類去完成。在這個(gè)模式中佩迟,工廠類和產(chǎn)品類往往可以依次對(duì)應(yīng)免胃。即一個(gè)抽象工廠對(duì)應(yīng)一個(gè)抽象產(chǎn)品,一個(gè)具體工廠對(duì)應(yīng)一個(gè)具體產(chǎn)品羔沙,這個(gè)具體的工廠就負(fù)責(zé)生產(chǎn)對(duì)應(yīng)的產(chǎn)品扼雏。

工廠方法模式(Factory Method pattern)是最典型的模板方法模式(Template Method pattern)應(yīng)用。

3诗充、角色結(jié)構(gòu)

抽象工廠(Creator)角色

是工廠方法模式的核心,與應(yīng)用程序無(wú)關(guān)碟绑。任何在模式中創(chuàng)建的對(duì)象的工廠類必須實(shí)現(xiàn)這個(gè)接口格仲。

具體工廠(Concrete Creator)角色

這是實(shí)現(xiàn)抽象工廠接口的具體工廠類,包含與應(yīng)用程序密切相關(guān)的邏輯凯肋,并且受到應(yīng)用程序調(diào)用以創(chuàng)建產(chǎn)品對(duì)象汽馋。

抽象產(chǎn)品(Product)角色

工廠方法模式所創(chuàng)建的對(duì)象的超類型圈盔,也就是產(chǎn)品對(duì)象的共同父類或共同擁有的接口

具體產(chǎn)品(Concrete Product)角色

這個(gè)角色實(shí)現(xiàn)了抽象產(chǎn)品角色所定義的接口驱敲。某具體產(chǎn)品有專門(mén)的具體工廠創(chuàng)建癌佩,它們之間往往一一對(duì)應(yīng)。

4围辙、模式應(yīng)用

工廠方法經(jīng)常用在以下兩種情況中:

第一種情況是對(duì)于某個(gè)產(chǎn)品放案,調(diào)用者清楚地知道應(yīng)該使用哪個(gè)具體工廠服務(wù),實(shí)例化該具體工廠吱殉,生產(chǎn)出具體的產(chǎn)品來(lái)。Java Collection中的iterator() 方法即屬于這種情況友雳。

第二種情況,只是需要一種產(chǎn)品押赊,而不想知道也不需要知道究竟是哪個(gè)工廠為生產(chǎn)的饺藤,即最終選用哪個(gè)具體工廠的決定權(quán)在生產(chǎn)者一方,它們根據(jù)當(dāng)前系統(tǒng)的情況來(lái)實(shí)例化一個(gè)具體的工廠返回給使用者流礁,而這個(gè)決策過(guò)程這對(duì)于使用者來(lái)說(shuō)是透明的涕俗。

--以上概念摘抄自百度百科,方便自己學(xué)習(xí)--

-----------------------------------------------------------------------------------

--開(kāi)始自己擼--

5神帅、實(shí)例講解

背景:比如說(shuō)我現(xiàn)在有這么個(gè)需求再姑,就是我要對(duì)面粉進(jìn)行加工,從而得到饅頭找御、掛面

首先我需要抽象產(chǎn)品(Product)角色

/**
 * 首先無(wú)論是做饅頭還是掛面元镀,他們都有一個(gè)加工方法,可以抽象出來(lái)
 * Machine:機(jī)器
 */
public interface MachineApi {
        //process:加工      material:材料
    public void process(String material);
    
}

然后我需要拿到具體產(chǎn)品

/**
 * 饅頭機(jī)器
 * steamed bun : 饅頭
 */
public class SteamedBunMachine implements MachineApi {
    @Override
    public void process(String material) {
        System.out.println("我把" + material + "加工成了饅頭");
    }
}

/**
 * 面條機(jī)器
 * noodle : 面條
 */
public class BoodleMachine implements MachineApi {
    @Override
    public void process(String material) {
        System.out.println("我把" + material + "加工成了面條");
    }
}

這個(gè)時(shí)候我需要一個(gè) 抽象工廠角色

public abstract class Factory{
    /**
     * 讓子類(具體工廠)來(lái)實(shí)例化具體對(duì)象(機(jī)器)
     */
    public abstract MachineApi newMachine();
    
    /**
     * 加工材料
     */
    public void process(String material){
        MachineApi machine = newMachine();
        machine.process(material);
    }
    
}

然后我需要兩家工廠霎桅,分別幫我生成饅頭和面條

//饅頭工廠
public class SteamedBunFactory extends Factory{
    //饅頭工廠栖疑,只需要提供饅頭機(jī)器就行
    @Override
    public MachineApi newMachine() {
        return new SteamedBunMachine();
    }
}

//面條工廠
public class NoodleFactory extends Factory{
    //面條工廠,只需要提供面條機(jī)器就行
    @Override
    public MachineApi newMachine() {
        return new BoodleMachine();
    }
}

最后我作為老板哆档,只需要操作工廠就可以進(jìn)行生成

SteamedBunFactory mSteamedBunFactory  = new SteamedBunFactory ();
mSteamedBunFactory.process("面粉");//我把面粉加工成了饅頭

總結(jié)

其實(shí)這個(gè)時(shí)候瓜浸,我作為老板插佛,我又想開(kāi)一家餅干廠,那么我只需要弄一臺(tái)餅干機(jī)器(繼承機(jī)器)氢拥,再弄一個(gè)餅干廠(繼承工廠)就可以了嫩海,根本不需要?jiǎng)又暗拇a叁怪,這個(gè)過(guò)程唯一變化的就是做饅頭和做面條的流程工藝不同,提取其中個(gè)性化善變的部分為獨(dú)立類血柳,通過(guò)依賴注入以達(dá)到解耦难捌、復(fù)用和方便后期維護(hù)拓展的目的栖榨。
版權(quán)聲明:個(gè)人原創(chuàng),若轉(zhuǎn)載愚争,請(qǐng)注明出處
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鞍陨,隨后出現(xiàn)的幾起案子缭裆,更是在濱河造成了極大的恐慌澈驼,老刑警劉巖缝其,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硕噩,死亡現(xiàn)場(chǎng)離奇詭異炉擅,居然都是意外死亡谍失,警方通過(guò)查閱死者的電腦和手機(jī)颠印,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)线罕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人袄琳,你說(shuō)我怎么就攤上這事唆樊《号裕” “怎么了红伦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵舌缤,是天一觀的道長(zhǎng)陵吸。 經(jīng)常有香客問(wèn)我壮虫,道長(zhǎng),這世上最難降的妖魔是什么饶唤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮祸穷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘檩咱。我一直安慰自己绊含,他們只是感情好躬充,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布以政。 她就那樣靜靜地躺著盈蛮,像睡著了一般技矮。 火紅的嫁衣襯著肌膚如雪袒炉。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天沉衣,我揣著相機(jī)與錄音霞势,去河邊找鬼。 笑死固以,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的篙螟。 我是一名探鬼主播惧所,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼势似,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起杯拐,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎顶滩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體仅醇,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡析二,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年安拟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了糠赦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖艾岂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情氓辣,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站梭稚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏絮吵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伴嗡。 院中可真熱鬧渣淤,春花似錦嗅定、人聲如沸渠退。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)著摔。三九已至,卻和暖如春定续,著一層夾襖步出監(jiān)牢的瞬間谍咆,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工私股, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摹察,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓倡鲸,卻偏偏與公主長(zhǎng)得像供嚎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子峭状,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345