設(shè)計(jì)模式-簡單工廠模式

設(shè)計(jì)模式的起源
模式的研究起源于建筑設(shè)計(jì)大師Christopher Alexander的關(guān)于城市規(guī)劃和建筑設(shè)計(jì)的著作卸察。盡管他的著作是針對城市規(guī)劃和建筑設(shè)計(jì)的铅祸,但是作者的觀點(diǎn)實(shí)際上適用于所有工程設(shè)計(jì)領(lǐng)域,包括軟件開發(fā)設(shè)計(jì)領(lǐng)域洪乍。

Alexander 在他的著作中指出夜焦,「每一個(gè)模式描述了一個(gè)在我們周圍不斷重復(fù)發(fā)生的問題岂贩,以及該問題的解決方案的核心萎津。這樣,你就能一次又一次地使用該方案而不必做重復(fù)勞動(dòng)」锉屈。盡管Alexander所指的是城市和建筑模式,但他的思想也同樣適用于面向?qū)ο笤O(shè)計(jì)模式遂黍,只是在面向?qū)ο蟮慕鉀Q方案里,我們用對象和接口代替了墻壁和門窗铃彰。兩類模式的核心都在于提供了相關(guān)問題的解決方案芯咧。

創(chuàng)建模式-為什么使用簡單工廠模式
設(shè)計(jì)模式一般主要分為創(chuàng)建模式、結(jié)構(gòu)模式邪铲、行為模式无拗。本文主要講解「創(chuàng)建模式」中的「簡單工廠模式」。

創(chuàng)建模式(Creational Pattern)是對類的實(shí)例化過程的抽象化蓝纲。一些系統(tǒng)在創(chuàng)建對象時(shí)税迷,需要?jiǎng)討B(tài)地決定怎樣創(chuàng)建對象,創(chuàng)建哪些對象箭养,以及如何組合和表示這些對象毕泌。創(chuàng)建模式描述了怎樣構(gòu)造和封裝這些動(dòng)態(tài)的決定。
創(chuàng)建模式分為類的創(chuàng)建模式和對象的創(chuàng)建模式兩種撼泛。
1.類的創(chuàng)建模式:類的創(chuàng)建模式使用繼承關(guān)系愿题,把類的創(chuàng)建延遲到子類,從而封裝了客戶端將得到哪些具體類的信息潘酗,并且隱藏了這些類的實(shí)例是如何創(chuàng)建和放在一起。
2.對象的創(chuàng)建模式: 對象的創(chuàng)建模式則把對象的創(chuàng)建過程動(dòng)態(tài)地委派給另一個(gè)對象琐脏,從而動(dòng)態(tài)地決定客戶端將得到哪些具體類的實(shí)例,以及這些類的實(shí)例是如何被創(chuàng)建和組合在一起的吹艇。

創(chuàng)建模式包括:簡單工廠模式阅签、工廠方法模式、抽象工廠模式路克、單例模式养交、多例模式、建造模式灰羽、原始模型模式等等鱼辙。

工廠模式的幾種形態(tài)
工廠模式專門負(fù)責(zé)將大量有共同接口的類實(shí)例化。工廠模式可以動(dòng)態(tài)決定將哪一個(gè)類實(shí)例化怠噪,不必事先知道每次要實(shí)例化哪一個(gè)類杜跷。工廠模式有以下幾種形態(tài):
1.簡單工廠模式(Simple Factory Pattern)
2.工廠方法模式(Factory Method Pattern)
3.抽象工廠模式(Abstract Factory Pattern)

簡單工廠模式,或稱靜態(tài)工廠方法(Static Factory Method)模式憋槐。該模式的核心是工廠類,這個(gè)類含有必要的判斷邏輯淑趾,可以決定在什么時(shí)候創(chuàng)建哪一個(gè)產(chǎn)品類的實(shí)例。而客戶端則可以免除直接創(chuàng)建產(chǎn)品對象的責(zé)任驳概,而僅僅負(fù)責(zé)「消費(fèi)」產(chǎn)品旷赖。簡單工廠模式通過這種做法實(shí)現(xiàn)了對責(zé)任的分割更卒。

栗子:
比如說有一家農(nóng)場,向市場銷售各種類型的水果俯萌。在農(nóng)場中有種植以下水果:
1.蘋果 Apple
2.葡萄 Grape
3.草莓 Strawberry

水果與其他的植物有很大的不同,水果最終是可以采摘食用的弱恒。那么一個(gè)自然的作法就是建立一個(gè)各種水果都適用的接口棋恼,以便與農(nóng)場里的其他植物區(qū)分開。


水果接口規(guī)定出所有的水果必須實(shí)現(xiàn)的接口义起,包括任何水果類必須具備的方法:
1.種植plant()
2.生長grow()
3.收獲harvest()

水果接口源碼:

public interface Fruit {
     //種植
     void plant();
     //生長
     void grow();
     //收獲
     void harvest();
}

Apple類是水果類的一種师崎,因此它實(shí)現(xiàn)了水果接口所聲明的所有方法。另外齐蔽,由于蘋果是多年生植物床估,因此多出一個(gè)treeAge性質(zhì),描述蘋果樹的樹齡蛙吏。
蘋果類的源碼:

public class Apple implements Fruit {
    private int treeAge;
     
    public void plant() {
        System.out.println(“Apple has been planted.”);
    }
     
    public void grow() {
        System.out.println(“Apple is growing.”);
    }
     
    public void harvest() {
        System.out.println(“Apple has been harvested.”);
    }
    
    public int getTreeAge() {
        return treeAge;
    }
    
    public void setTreeAge(int treeAge) {
        this.treeAge = treeAge;
    }
}

同樣鞋吉,Grape類是水果類的一種,也實(shí)現(xiàn)了Fruit接口所聲明的所有方法泼诱。但由于葡萄分為有籽和無籽兩種赊锚,因此,比普通水果多出一個(gè)seedless性質(zhì)耸袜。
葡萄類的源碼:

public class Grape implements Fruit {
    private boolean seedless;
     
    public void plant() {
        System.out.println(“Grape has been planted.”);
    }
    
    public void grow() {
        System.out.println(“Grape is growing.”);
    }
    
    public void harvest() {
        System.out.println(“Grape has been harvested.”);
    }
    
    public boolean getSeedless() {
        return seedless;
    }
    
    public void setSeedless(boolean seedless) {
        this.seedless = seedless;
    }
}

Strawberry 類實(shí)現(xiàn)了Fruit接口堤框,因此也是水果類型的子類型。
草莓類源碼:

public class Strawberry implements Fruit {
    public void plant() {
        System.out.println(“Grape has been planted.”);
    }
    
    public void grow() {
        System.out.println(“Grape is growing.”);
    }
    
    public void harvest() {
        System.out.println(“Grape has been harvested.”);
    }
}

接下來启绰,我們需要定義一個(gè)工廠類沟使,在我們的栗子中是FruitFactory類。該類中有一個(gè)靜態(tài)的getFruit方法着倾,取決于條件的給予叽唱,返回不同的Fruit實(shí)例。

class FruitFactory {
    public static Fruit getFruit(String criteria) {
        if (criteria.equals(“Apple”)) {
            return new Apple();
        } else if (criteria.equals(“Grape")) {
            return new Grape();
        } else if (criteria.equals(“Strawberry”)) {
            return new Strawberry();
        }
        return null;  
    }
}

最后作為消費(fèi)者虎眨,僅需調(diào)用FruitFactory的靜態(tài)方法getFruit()镶摘,即可以得到可口的水果了。具體代碼如下:

public class FruitConsumer {
    public static void main(String[] args) {
        Fruit fruit = null;
        
        fruit = FruitFactory.getFruit("Apple");
        fruit.harvest();
        
        fruit = FruitFactory.getFruit("Grape");
        fruit.harvest(); 
               
        fruit = FruitFactory.getFruit("Strawberry");
        fruit.harvest();
    }
}

輸出結(jié)果:

Apple has been harvested.
Grape has been harvested.
Strawberry has been harvested.

參考:
「1」Design Patterns: Elements of Reusable Object-Oriented Software
「2」Java 與模式
「3」A Java Factory Pattern example

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市涝缝,隨后出現(xiàn)的幾起案子拒逮,更是在濱河造成了極大的恐慌,老刑警劉巖滩援,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玩徊,死亡現(xiàn)場離奇詭異,居然都是意外死亡泣棋,警方通過查閱死者的電腦和手機(jī)畔塔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門纪吮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人棚辽,你說我怎么就攤上這事±谱椋” “怎么了联逻?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵包归,是天一觀的道長。 經(jīng)常有香客問我公壤,道長,這世上最難降的妖魔是什么沾鳄? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任译荞,我火速辦了婚禮休弃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘玫芦。我一直安慰自己桥帆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布叶骨。 她就那樣靜靜地躺著祈匙,像睡著了一般天揖。 火紅的嫁衣襯著肌膚如雪跪帝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天斑唬,我揣著相機(jī)與錄音黎泣,去河邊找鬼。 笑死褐着,一個(gè)胖子當(dāng)著我的面吹牛托呕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谴餐,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼呆抑,長吁一口氣:“原來是場噩夢啊……” “哼鹊碍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起侈咕,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤耀销,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后罐柳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狰住,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年张吉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片催植。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肮蛹,死狀恐怖勺择,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伦忠,我是刑警寧澤省核,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站昆码,受9級特大地震影響芳撒,放射性物質(zhì)發(fā)生泄漏未桥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一芥备、第九天 我趴在偏房一處隱蔽的房頂上張望冬耿。 院中可真熱鬧,春花似錦萌壳、人聲如沸亦镶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缤骨。三九已至,卻和暖如春尺借,著一層夾襖步出監(jiān)牢的瞬間绊起,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工燎斩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虱歪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓栅表,卻偏偏與公主長得像笋鄙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子怪瓶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

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