工厂模式两种:工厂模式,抽象工厂模式。
工厂方法:把对象的实现延迟到子类完成。
使用场景:创建对象。
好处:降低客户端与模块之间的耦合度。(最少支持原则)
工厂模式传送门:http://blog.youkuaiyun.com/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。
晚安。