工厂模式学习

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

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

使用场景:创建对象。

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

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

晚安。












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值