工厂模式学习

来源:互联网 发布:re管理器怎样改mac 编辑:程序博客网 时间:2024/06/14 05:50

工厂模式两种:工厂模式,抽象工厂模式。

工厂方法:把对象的实现延迟到子类完成。

使用场景:创建对象。

好处:降低客户端与模块之间的耦合度。(最少支持原则)

工厂模式传送门: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。

晚安。












原创粉丝点击