工廠模式學習

工廠模式兩種:工廠模式,抽象工廠模式。

工廠方法:把對象的實現延遲到子類完成。

使用場景:創建對象。

好處:降低客戶端與模塊之間的耦合度。(最少支持原則)

工廠模式傳送門: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。

晚安。












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