工廠方法模式

1、定義、使用場景

定義一個用于創建對象的接口,讓子類決定實例化那個類。在需要生成復雜對象的地方,都可以使用工廠方法模式。

概念總是抽象的,下面從代碼的角度去理解。

2、實現

工廠方法模式一般有四大模塊:

  • 抽象產品類,工廠方法所創建的產品的父類
  • 具體的產品類,實現了抽象產品類的具體產品
  • 抽象工廠類,工廠方法模式的核心
  • 具體的工廠類,實現具體的產品生產業務邏輯

接下來按照這四個模塊來實現工廠方法模式。

先舉個栗子,對于水果7和水果7plus來說除了基本的共性外,相對明顯的差別就是水果7plus是雙攝像頭和大尺寸。

所以首先聲明一個抽象的產品類:

public abstract class Iphone {
    public abstract void camera();

    public abstract void screen();
}

接下來就是具體的產品類:

public class Iphone7 extends Iphone {
    @Override
    public void camera() {
        Log.e("Iphone7", "Iphone7的單攝");
    }

    @Override
    public void screen() {
        Log.e("Iphone7", "Iphone7的4.7寸屏幕");
    }
}
public class Iphone7Plus extends Iphone {
    @Override
    public void camera() {
        Log.e("Iphone7Plus", "Iphone7Plus的雙攝");
    }

    @Override
    public void screen() {
        Log.e("Iphone7Plus", "Iphone7Plus的5.5寸屏幕");
    }
}

產品定義好了,就需要工廠生產了,當然要先定義一個抽象的工廠類:

public abstract class IphoneFactory {
    public abstract <T extends Iphone> T createPhone(Class<T> clz);
}

接下來就是具體的工廠類:

public class NewIphoneFactory extends IphoneFactory {
    @Override
    public <T extends Iphone> T createPhone(Class<T> clz) {
        Iphone iphone = null;
        try {
            iphone = (Iphone) Class.forName(clz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) iphone;
    }
}

到這里一個工廠方法模式就搭建出來了,測試下吧:

public class Client {
    public static void test() {
        NewIphoneFactory factory = new NewIphoneFactory();

        Iphone7 iphone7 = factory.createPhone(Iphone7.class);
        iphone7.camera();
        iphone7.screen();

        Iphone7Plus iphone7Plus = factory.createPhone(Iphone7Plus.class);
        iphone7Plus.camera();
        iphone7Plus.screen();
    }
}

結果如下:

result
3、工廠類的其它實現

前邊我們工廠中通過反射方式構建出產品,需要那個類的對象,傳入哪個類的類型即可,除了這種方式外我們還可以有別的選擇:為每個產品都定義一個具體的工廠類,之間相互隔離。

首先對抽象工廠類做如下修改:

public abstract class IphoneFactory {
    public abstract Iphone createPhone();
}

然后是具體的工廠類:

public class Iphone7Factory extends IphoneFactory {
    @Override
    public Iphone createPhone() {
        return new Iphone7();
    }
}
public class Iphone7PlusFactory extends IphoneFactory {
    @Override
    public Iphone createPhone() {
        return new Iphone7Plus();
    }
}

當然調用時就需要創建兩個工廠類對象了,我們可以稱之為多工廠方法模式。

當我們只有一個工廠類時,可以考慮簡化掉抽象工廠類,直接在具體的工廠類中使用靜態方法,如下:

public class IphoneFactory {
    public static Iphone createPhone() {
        return new Iphone7Plus();
    }
}
4、小結

工廠方法模式采用抽象的架構,將具體的任務交給子類去完成,方便擴展,同時降低了耦合。當然缺點也是有的,例如需要添加新的產品時就要編寫一個產品類,還要引入抽象類,導致代碼結構變復雜。所以使用時就需要根據具體的場景去權衡了。

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

推薦閱讀更多精彩內容