工廠模式兩種:工廠模式,抽象工廠模式。
工廠方法:把對象的實現延遲到子類完成。
使用場景:創建對象。
好處:降低客戶端與模塊之間的耦合度。(最少支持原則)
工廠模式傳送門:http://blog.csdn.net/l2show/article/details/47704005
按照傳送門的教程,把簡單工廠模式學習一遍。//嘗試用UML,把工廠模式繪製出來。現階段的學習,只能的模仿,體會階段。
套路:
創建一個接口。所有產品具有的公共功能(接口)。
public interface HttpBaseRequest {
void httpRequest();
}
創建產品類。實現接口。各個不同產品(具體實現子類,實現統一接口方法,裏邊各自實現自己的功能。)
public class SimulationGet implements HttpBaseRequest {
public static final String TAG = SimulationGet.class.getSimpleName();
public String data;
public SimulationGet(String data){
this.data = data;
}
@Override
public void httpRequest() {
doHttpGet(data);
}
private void doHttpGet(String data){
Log.e(TAG,"GET:" + data);
}
}
創建工廠類。返回類型:接口。方法返回具體子類。//可以根據傳參,return 各自實現接口的子類。
public class HttpBaseRequestImp {
public static final int POST = 1;
public static final int GET = 2;
public static HttpBaseRequest onCreate(int type,String data){
switch (type){
case POST:
return new SimulationPost(data);
case GET:
return new SimulationGet(data);
default:
return new SimulationPost(data);
}
}
}
//簡單工廠模式
HttpBaseRequest httpBaseRequest = HttpBaseRequestImp.onCreate(HttpBaseRequestImp.GET,"執行Get請求");
httpBaseRequest.httpRequest();
httpBaseRequest = HttpBaseRequestImp.onCreate(HttpBaseRequestImp.POST,"執行Get請求");
httpBaseRequest.httpRequest();
我目前通過看這個例子,套路記住了,還是沒有理解抽象工廠模式。添加泛型約束,就可以。後期理解。挖坑。。。。
先創建一個接口
public interface IPhone {
void getOS();
}
創建一個抽象類,對傳入類型做約束。使用泛型。//首先通過泛型來約束輸入輸出的參數類型,把異常拋到上層去處理並實現具體的工廠.
public abstract class IGenerator {
public abstract <T extends IPhone> T generatePhone(Class<T> clazz) throws Exception;
}
public class PhoneGenerator extends IGenerator {
//bugly 如何定義此處泛型
@Override
public <T extends IPhone> T generatePhone(Class<T> clazz) throws Exception {
IPhone iPhone = null;
iPhone = (IPhone) Class.forName(clazz.getName()).newInstance();
return (T) iPhone;
}
}
抽象工廠如果後期需要添加新產品,只需要實現接口。通過反射動態調用即可。
public class XiaoMiPhone implements IPhone {
public static final String TAG = XiaoMiPhone.class.getSimpleName();
@Override
public void getOS() {
Log.e(TAG,"小米");
}
}
使用方法:調用該方法即可。
private void performIPhone(){
try{
//站在給開發者角度,去做。
XiaoMiPhone iGenerator = new PhoneGenerator().generatePhone(XiaoMiPhone.class);
iGenerator.getOS();
}catch (Exception e){}
}
總結,教了,學了,練的還不夠,內化於心。加油了。。
在開發中,具體業務邏輯的使用場景,總結下:知道的有List 的迭代器iterator,Bitmap。
晚安。