【設計模式與Android】工廠方法模式——化工女神的工廠

什麼是工廠方法模式

 

所謂工廠方法模式,就是定義一個用於創建對象的接口,讓子類決定實例化哪個類的設計模式。工廠模式適用於需要生成複雜對象的地方。

 

工廠方法模式的實現方式

 

這次我不打算用文學作品舉例了,以前前幾篇文章用《三國演義》和《水滸傳》舉例,某IT社區的技術編輯居然認爲我是半路出家做Android程序員的文科生。既然這個設計模式以“工廠”命名,那麼我們就用工廠打比方,我用我的化學知識證明我是高中學的理科,大學學的軟件工程。國內某985院校的化工女神畢業後自主創業,開辦了一個生產化肥的化工廠,主要產品有氮肥、磷肥、鉀肥、×××(好像有什麼奇怪的東西混進來了)。

首先定義一個抽象的化工廠類:

public abstract class ChemicalFactory {

    public abstract <T extends Chemical> T createChemical(Class<T> clz);

}

 

然後定義化工女神的化肥工廠:

public class GoddessChemicalFactory extends ChemicalFactory {

    @Override
    public <T extends Chemical> T createChemical(Class<T> clz) {
        Chemical chemical = null;
        try {
            chemical = (Chemical)Class.forName(clz.getName()).newInstance();
        }catch (Exception e){
            e.printStackTrace();
        }
        return (T) chemical;
    }

}

 

接下來定義一個抽象的化肥類:

public abstract class Chemical {

    /**
     * 化肥特徵之一——投放到地上
     */
    public abstract void toGround();

    /**
     * 化肥特徵之二——變成氣體後纔會起作用
     */
    public abstract void becomeGas();

}

 

定義氮肥類:

public class NChemical extends Chemical {
    @Override
    public void toGround() {
        Log.e("NChemical","氮肥被投放到白菜地裏");
    }

    @Override
    public void becomeGas() {
        Log.e("NChemical","氮肥釋放含N元素的氣體被白菜的葉子吸收");
    }
}

 

定義磷肥類:

public class PChemical extends Chemical {
    @Override
    public void toGround() {
        Log.e("PChemical","磷肥被投放到西紅柿地裏");
    }

    @Override
    public void becomeGas() {
        Log.e("PChemical","磷肥釋放含P元素的氣體被西紅柿的果實吸收");
    }
}

 

定義鉀肥類:

public class KChemical extends Chemical {
    @Override
    public void toGround() {
        Log.e("KChemical","鉀肥被投放到胡蘿蔔地裏");
    }

    @Override
    public void becomeGas() {
        Log.e("KChemical","鉀肥釋放含K元素的氣體被胡蘿蔔的根系吸收");
    }
}

 

定義×××類:

public class Explosive extends Chemical {
    @Override
    public void toGround() {
        Log.e("Explosive","×××被投放到敵人陣地裏");
    }

    @Override
    public void becomeGas() {
        Log.e("Explosive","×××釋放溫度高的氣體(火焰)和速度快的氣體(衝擊波)被敵人的身體吸收");
    }
}

 

開工大吉:

GoddessChemicalFactory factory = new GoddessChemicalFactory();

NChemical nChemical = factory.createChemical(NChemical.class);
nChemical.toGround();
nChemical.becomeGas();

PChemical pChemical = factory.createChemical(PChemical.class);
pChemical.toGround();
pChemical.becomeGas();

KChemical kChemical = factory.createChemical(KChemical.class);
kChemical.toGround();
kChemical.becomeGas();

Explosive explosive = factory.createChemical(Explosive.class);
explosive.toGround();
explosive.becomeGas();

 

化工女神的化肥工廠日進斗金,讀化工女神的故事的程序員學會了工廠方法模式,這位技術編輯也不再懷疑作者是文科生。

 

Android源碼中的工廠方法模式

 

1)Iterable及其子類

ArrayList、LinkedList和HashSet等常見數據結構都實現了Iterable接口,這就是典型的工廠方法模式。

 

2)Activity的onCreate

沒錯,就是Android初學者第一眼就見到的onCreate,任何Activity都是Activity的子類,而任何控件都是View的子類,onCreate方法是最容易被遺忘的工廠方法模式。

 

Android開發中如何利用工廠方法模式

 

1)工廠方法模式利用依賴注入以達到解耦、複用和方便後期維護拓展的目的。工廠方法模式應用廣泛,我提示一個最經典的應用場景:Android數據存儲中的本地存儲可以細分爲File、SharedPreferences和SQLite三種,可以繼承有增、刪、改、查四種方法的抽象產品類。

 

需要注意的幾個問題

 

1)工廠方法模式的缺點是每次添加新的產品時就要編寫一個新的產品類,同時還要引入抽象層,這必然會導致類結構的複雜化,所以工廠方法模式不適用於結構太簡單的情況。


本系列其他博客


【設計模式與Android】抽象工廠模式——嵌合體克隆工廠


【設計模式與Android】策略模式——錦囊裏的上策中策下策


【設計模式與Android】狀態模式——一個人的兩幅面孔


【設計模式與Android】責任鏈模式——曹瞞兵敗走華容


【設計模式與Android】命令模式——軍令如山


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章