定義:工廠模式定義了一個接口,讓使用者更簡潔,正確的實例化對象。
用處:工廠模式適合較爲複雜的對象的創建。但是其實工廠模式沒有用的那麼模塊化,我們平時看到的好多源碼就是工廠模式。
例子:在一個產品詳情頁面,一個產品的狀態有好幾種,沒有購買,購買了。。。我們可以用不同的產品來封裝不同的狀態,這樣這些狀太更加整潔,而不是在很多的if-else中凌亂。
先定義一個狀態的抽象類,來約束子類封裝不同狀態。(這是工廠模式的產品基類)
public abstract class ViewStatus {
public abstract void setStatus(String statusDes);
}
然後,定義該產品不同的狀態(不同的產品)
public class StatusOne extends ViewStatus {
@Override
public void setStatus(String statusDes) {
System.out.println("沒購買:"+statusDes);
}
}
購買了的狀態:
public class StatusTwo extends ViewStatus {
@Override
public void setStatus(String statusDes) {
System.out.println("購買:" + statusDes);
}
}
接下來該工廠基類了
public abstract class Factoy {
public abstract ViewStatus createStatus();
}
實例化不同的狀態的工廠
/**
* 沒有購買的工廠
*/
public class StatusOneFactor extends Factoy {
@Override
public ViewStatus createStatus() {
return new StatusOne();
}
}
/**
* 購買的狀態
*/
public class StatusTwoFactor extends Factoy {
@Override
public ViewStatus createStatus() {
return new StatusTwo();
}
}
使用該工廠模式:
Factoy factoy = new StatusOneFactor();
ViewStatus statusOne = factoy.createStatus();
statusOne.setStatus("購買了!");
Factoy factoy1 = new StatusTwoFactor();
ViewStatus statusOne1 = factoy1.createStatus();
statusOne1.setStatus("沒購買!");
總結:實例化需要的狀態工廠,然後取出該狀態,最後去使用就好了。這個例子是多工廠模式,當我們的工廠只需要一個的時候可以簡化工廠模式的父類,做一個靜態工廠。(當然那些只有一個工廠的有點不符合對修改關閉)
工廠模式的優點:
- 我們有一堆不同狀態的類需要創建時,我們可以使用工廠模式。因爲他可以很好的封裝這些狀態和封裝創建,使用起來方便。
- 可以封裝創建比較麻煩的類,這樣不需要使用者去了解類中的實現。
- 符合設計模式規則,對拓展開放最修改關閉。
案例:
1.安卓中我們的activity,其實就是谷歌工程師已經封裝好的工廠模式,我們只需要每次創建不同的產品,即繼承Activity的不 同頁面。
public Activity newActivity(ClassLoader cl, String className,
Intent intent)
throws InstantiationException, IllegalAccessException,
ClassNotFoundException {
return (Activity)cl.loadClass(className).newInstance();
}
其實,就是用反射做的工廠。給frameWork返回我們的不同activity。我們可以將工廠類稍微修改一下,優點就是工廠類不需要對不同產品都去做個工廠類。缺點:反射的缺點,運行較慢。
public <T extends ViewStatus> T createStatues(Class<T> tClass){
ViewStatus viewStatus = null;
try {
viewStatus= (ViewStatus) Class.forName(tClass.getName()).newInstance();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return (T)viewStatus;
}
2.我們平時每一個activity封裝自己的跳轉方法,既可以減少代碼冗餘,也可以表明該類跳轉需要的不同參數。
public static void toActivity(Context context){
Intent intent=new Intent(context,HaAcitivity.class);
context.startActivity(intent);
}
這些都是工廠模式的一種實現。