什麼是工廠方法模式程序員
所謂工廠方法模式,就是定義一個用於建立對象的接口,讓子類決定實例化哪一個類的設計模式。工廠模式適用於須要生成複雜對象的地方。設計模式
工廠方法模式的實現方式數據結構
此次我不打算用文學做品舉例了,之前前幾篇文章用《三國演義》和《水滸傳》舉例,某IT社區的技術編輯竟然認爲我是半路出家作Android程序員的文科生。既然這個設計模式以「工廠」命名,那麼咱們就用工廠打比方,我用個人化學知識證實我是高中學的理科,大學學的軟件工程。國內某985院校的化工女神畢業後自主創業,開辦了一個生產化肥的化工廠,主要產品有氮肥、磷肥、鉀肥、×××(好像有什麼奇怪的東西混進來了)。ide
首先定義一個抽象的化工廠類:spa
public abstract class ChemicalFactory {
public abstract <T extends Chemical> T createChemical(Class<T> clz);
}設計 |
而後定義化工女神的化肥工廠:orm
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; }
}對象 |
接下來定義一個抽象的化肥類:blog
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】命令模式——軍令如山