Java23種設計模式-簡單工廠模式

簡單工廠模式詳解

1,概述

簡單工廠模式屬于創建型模式又叫做靜態工廠方法模式,它屬于類創建型模式。在簡單工廠模式中,可以根據參數的不同返回不同類的實例。

簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類

簡單工廠只需要傳入一個正確的參數,就可以獲取所需要的對象,而無需知道其實現過程。

簡單工廠模式中用于被創建實例的方法通常為靜態(static)方法,因此簡單工廠模式又被成為靜態工廠方法(Static Factory Method)。

下面由我深入淺出的給大家講解下簡單工廠模式,不足之處還望批評指正

2,結構圖

image
  • Factory:工廠類,簡單工廠模式的核心,它負責實現創建所有實例的內部邏輯。工廠類的創建產品類的方法可以被外界直接調用,創建所需的產品對象。
  • IProduct:抽象產品類,簡單工廠模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。
  • Product:具體產品類,是簡單工廠模式的創建目標

3,簡單工廠舉例說明

這里我們以食品加工廠來舉例,假設有一個食品加工廠,主要加工啤酒飲料礦泉水,根據需求,我們就需要用一個單獨的類來專門生產啤酒飲料礦泉水,這就用到了簡單工廠模式,下面我們來實現簡單工廠模式。

4,具體代碼實現

第一步:我們首先創建我們的食品基類,也就是食品父類,也就是我們結構圖中抽象產品類,這是個抽象類。

package pattern.simplenessfactory;

/**
 *產品抽象類
 * @author ningbeibei
 *
 */
public abstract class Product {
    //獲取產品方法
    public abstract void getFood();
}

第二步:具體的啤酒飲料礦泉水食品類都需要繼承食品抽象類 Product

package pattern.simplenessfactory;

/**
 * 具體啤酒類繼承自Product類
 * @author ningbeibei
 *
 */
public class Berr extends Product {

    @Override
    public void getFood() {
        System.out.println("啤酒");
    };
}
package pattern.simplenessfactory;

/**
 * 具體飲料類繼承自Product
 * @author ningbeibei
 *
 */
public class Drinks extends Product {

    @Override
    public void getFood() {
        System.out.println("飲料");
    }

}
<pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: &quot;Courier New&quot; !important; font-size: 12px !important; white-space: pre-wrap;">package pattern.simplenessfactory; /** * 具體飲料類繼承自Product
 * @author ningbeibei
 * */
public class Drinks extends Product {

    @Override public void getFood() {
        System.out.println("飲料");
    }

package pattern.simplenessfactory;

/**
 * 具體礦泉水類繼承自Product
 * @author ningbeibei
 *
 */
public class Water extends Product {

    @Override
    public void getFood() {
        System.out.println("礦泉水");
    }
} 

第三步:上面我們已經把產品類設計好了,現在開始創建食品加工廠Factory

食品加工工廠專門負責創建具體的食品對象并返回,大家看下面getCommodity(String type) 方法,這個方法是靜態方法,并且根據參數決定創建食品對象,方法內部通過邏輯判斷決定返回啤酒還是飲料或者是礦泉水,要注意的是:Product product = null; 這個變量用到的是java的特性繼承和多態,簡單說:子類對象父類型。

package pattern.simplenessfactory;
/**
 * 食品加工工廠
 * 根據需要專門負責生產各中食品,也就是專門創建各種所需對象
 * @author ningbeibei
 */
public class Factory {
    //根據傳入參數返某個食品,也就是食品對象
    public static Product getCommodity(String type) {
        //這個變量是抽象類,也就是食品類的父類
        Product product = null;    
        switch (type) {
        case "啤酒":
            product = new Berr();
            break;
        case "飲料":
            product = new Drinks();
            break;
        case "礦泉水":
            product = new Water();
            break;
        }
        return product;
    }
}
 

第四步:編寫測試類

package pattern.simplenessfactory;

/**
 * 簡單工廠模式測試類
 * @author ningbeibei
 */
public class test {

    public static void main(String[] args) {
        //通過工廠Factory類中的getCommodity()方法獲取啤酒對象
        Factory.getCommodity("啤酒").getFood();
        //通過工廠Factory類中的getCommodity()方法獲取飲料對象
        Factory.getCommodity("飲料").getFood();
        //通過工廠Factory類中的getCommodity()方法獲取礦泉水對象
        Factory.getCommodity("礦泉水").getFood();
    }
}

6,思考題

現在我們來思考一個問題,如果我這個工廠隨著規模擴大業務提升,我現在不但要賣啤酒飲料礦泉水,我還要賣花生牛奶八寶粥,請問在現有簡單工廠模式下怎么擴展新產品?

7,思考題解答

如果簡單工廠要擴展新產品那么需要以下幾步

(1),新增產品類并繼承Product類

package pattern.simplenessfactory;

/**
 * 新增產品花生,繼承自Product類
 * @author ningbeibei
 *
 */
public class Peanut extends Product {
    
    @Override
    public void getFood() {
        System.out.println("新增產品花生");
    }

}

(2),修改食品工廠Factory類中的邏輯判斷,添加新增產品花生邏輯判斷

package pattern.simplenessfactory;
/**
 * 食品加工工廠
 * 根據需要專門負責生產各中食品,也就是專門創建各種所需對象
 * @author ningbeibei
 */
public class Factory {
    //根據傳入參數返某個食品,也就是食品對象
    public static Product getCommodity(String type) {
        //這個變量是抽象類,也就是食品類的父類
        Product product = null;
        switch (type) {
        case "啤酒":
            product = new Berr();
            break;
        case "飲料":
            product = new Drinks();
            break;
        case "礦泉水":
            product = new Water();
            break;
        case "花生":
            product = new Peanut();
            break;
        }
        return product;
    }
}

現在我們發現我們竟然修改了食品工廠邏輯代碼,這對于一個大型項目來說,是有風險的,并且違背了設計模式開閉原則:簡單說明開閉原則,就是對擴展開放對修改封閉。

測試類

package pattern.simplenessfactory;

/**
 * 簡單工廠模式測試類
 * @author ningbeibei
 */
public class test {

    public static void main(String[] args) {
        //通過工廠Factory類中的getCommodity()方法獲取啤酒對象
        Factory.getCommodity("啤酒").getFood();
        //通過工廠Factory類中的getCommodity()方法獲取飲料對象
        Factory.getCommodity("飲料").getFood();
        //通過工廠Factory類中的getCommodity()方法獲取礦泉水對象
        Factory.getCommodity("礦泉水").getFood();
        //新增花生產品,通過工廠Factory類中的getCommodity()方法獲取花生對象
        Factory.getCommodity("花生").getFood();
    }
}

運行結果

image

8,現在我們總結下簡單工廠模式的優缺店

優點:

  • 工廠類含有必要的判斷邏輯,可以決定在什么時候創建哪一個產品類的實例,客戶端可以免除直接創建產品對象的責任,而僅僅“消費”產品;簡單工廠模式通過這種做法實現了對責任的分割,它提供了專門的工廠類用于創建對象
  • 客戶端無須知道所創建的具體產品類的類名,只需要知道具體產品類所對應的參數即可,對于一些復雜的類名,通過簡單工廠模式可以減少使用者的記憶量。
  • 通過引入配置文件,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產品類,在一定程度上提高了系統的靈活性。

  缺點:

  • 由于工廠類集中了所有產品創建邏輯,一旦不能正常工作,整個系統都要受到影響。
  • 使用簡單工廠模式將會增加系統中類的個數,在一定程序上增加了系統的復雜度和理解難度。
  • 系統擴展困難,一旦添加新產品就不得不修改工廠邏輯,同樣破壞了“開閉原則”;在產品類型較多時,有可能造成工廠邏輯過于復雜,不利于系統的擴展和維護
  • 簡單工廠模式由于使用了靜態工廠方法,造成工廠角色無法形成基于繼承的等級結構

9,java工廠模式學習思路

先****簡單工廠模式===》而后工廠方法模式====》最后****抽象工廠模式

  學習就像打野要先打野區怪伺機偷小龍,最后搞大龍

由淺入深的學習在才能理解的更深更全面而后方能融會貫通

寫的不足之處望批評指正,我一定改

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容