1. 程式人生 > >【設計模式與Android】工廠方法模式——化工女神的工廠

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

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


本文出自 “玖哥的書房” 博客,請務必保留此出處http://dongfeng9ge.blog.51cto.com/9191243/1972483

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