Java設計模式--簡單工廠模式與抽象工廠模式

簡單工廠模式
以女媧造人爲例。下面是類圖。
這裏寫圖片描述
步驟:
1、先定義接口人

2、不同的人種實現人這個接口,並實現接口中的方法

3、定義一個生產人的工廠: Human createHuman(Class c)
傳入要生產的人種對應的類,即可進行生產相應的人種。
human =(Human)Class.forName(c.getName()).newInstance(); //產生一個人種

4、在主類調用工廠類中的方法即可。Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class);
該對象whiteHuman便可以調用接口中的方法了。

工廠方法模式還有一個非常重要的應用,就是延遲始化(Lazy initialization),即一個對象初始化完畢後就不釋放,等到再次用到得就不用再次初始化了,直接從內存過中拿到就可以了。實現方法:通過集合Map來進行存儲。

if(humans.containsKey(c.getSimpleName()))
{
    human = humans.get(c.getSimpleName());
}
else
{
    human = (Human)Class.forName(c.getName()).newInstance();
    // 放到 MAP 中
    humans.put(c.getSimpleName(), human);
}

抽象工廠模式
上面的例子利用工廠類種的方法可以產生不同的人種。但是如果要求人種有性別的話,那麼生產的方式也應當做相應的調整。先看下Human的類圖


從類圖中可以看出一個接口、幾個抽象類、幾個實現類。其中三個抽象類在抽象工廠模式中是叫做產品等級,六個實現類是叫做產品族。

下面看一下抽象工廠的類圖:

這裏寫圖片描述

抽象工廠只實現了一個 createHuman 的方法。使用枚舉參數(可以用枚舉將各種各樣的人種定義出來,可以有不同的性別等屬性),讓兩個生產的工廠繼承抽象工廠,並實現其方法createHuman (相應的枚舉變量),即可以生產出所需要的各種各樣的人種。如下爲生產男性人種的工廠

public class MaleHumanFactory extends AbstractHumanFactory {
    //創建一個男性黑種人
    public Human createBlackHuman() {
    return super.createHuman(HumanEnum.BlackMaleHuman);
    }
    //創建一個男性白種人
    public Human createWhiteHuman() {
    return super.createHuman(HumanEnum.WhiteMaleHuman);
    }
    //創建一個男性黃種人
    public Human createYellowHuman() {
    return super.createHuman(HumanEnum.YelloMaleHuman);
    }
}

在主類進行生產:使用特定的生產線生產特定的人種。

//第一條生產線,男性生產線
HumanFactory maleHumanFactory = new MaleHumanFactory();
//第二條生產線,女性生產線
HumanFactory femaleHumanFactory = new FemaleHumanFactory();
//生產線建立完畢,開始生產人了:
Human maleYellowHuman = maleHumanFactory.createYellowHuman();
Human femaleYellowHuman = femaleHumanFactory.createYellowHuman();
maleYellowHuman.cry();
maleYellowHuman.laugh();
femaleYellowHuman.sex();

總結:
(1)工廠方法模式是有一個抽象的父類定義公共接口,子類負責生成具體的對象,這樣做的目的是將類的實例化操作延遲到子類中完成。

(2)抽象工廠模式提供一個創建一系列相關或相互依賴對象的接口,而無須指定他們具體的類。它針對的是有多個產品的等級結構。而工廠方法模式針對的是一個產品的等級結構。

(3)工廠模式符合 OCP 原則,也就是開閉原則,比如就性別的問題,這個世界上還存在雙性人,是男也是女的人,那這個就是要在我們的產品族中增加一類產品,同時再增加一個工廠就可以解決這個問題。

(4)好處:高內聚,低耦合,在一個較大的項目組,產品是由一批人定義開發的,但是提供其他成員訪問的時候,只有工廠方法和產品的接口,也就是說只需要提供 Product Interface 和 Concrete Factory 就可以產生自己需要的對象和方法。方便產品的迭代更新。

發佈了46 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章