当Android遇见工厂模式
2016-11-30 22:49
260 查看
我们先看一下一个Android系统应用中的工厂模式列子,再讲解工厂模式。
package com.android.mms.ui; import android.content.Context; import android.util.Log; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import com.android.mms.model.Model; /** * The factory of concrete presenters. */ public class PresenterFactory { private static final String TAG = "PresenterFactory"; private static final String PRESENTER_PACKAGE = "com.android.mms.ui."; public static Presenter getPresenter(String className, Context context, ViewInterface view, Model model) { try { if (className.indexOf(".") == -1) { className = PRESENTER_PACKAGE + className; } Class c = Class.forName(className); Constructor constructor = c.getConstructor( Context.class, ViewInterface.class, Model.class); return (Presenter) constructor.newInstance(context, view, model); } catch (ClassNotFoundException e) { Log.e(TAG, "Type not found: " + className, e); } catch (NoSuchMethodException e) { // Impossible to reach here. Log.e(TAG, "No such constructor.", e); } catch (InvocationTargetException e) { Log.e(TAG, "Unexpected InvocationTargetException", e); } catch (IllegalAccessException e) { Log.e(TAG, "Unexpected IllegalAccessException", e); } catch (InstantiationException e) { Log.e(TAG, "Unexpected InstantiationException", e); } return null; } }
该代码来自于Android系统中的Mms模块Ui包下,为显示缩略图的PresenterFactory,我们可以看到,使用了反射。
工厂设计模式在实际的开发中使用得非常多,我觉得已经学习过简单的工厂模式(若没学过,即A,B实现类,P为工厂类,通过传入参数“A”,”B”,P里面进行判断,若是A就new A对象,若是B则new 一个B对象返回),通过简单的工厂设计模式可以达到类的 解耦合目的,但是简单工厂设计模式依然存在问题,我们不可能在设计工厂的时候,就知道我们以后要生成哪些类,那就是在增加一个子类时都需要修改工厂类,这样很麻烦,而且那种,根据传入参数进行判断,从而自己new出不同的类的机制对于一个大型项目而言,是灾难性的。
从简单工厂模式中,对于实现类而言,的确是符合我们的开闭原则,当我们要添加新产品时,无需对业务进行修改,但是对于我们的工厂类而言,开闭原则没有很好的体现,每次都得修改。
而,我们上面粘贴的代码中,使用反射机制,这才是符合开闭原则的工厂模式。我们将类名当做参数传入,这样以后我们新建多少子类,都无需修改原来的代码。
软件设计中,解耦一直是个大问题,也看到过一些C语言的项目,耦合度令人咂舌,而java中,其实很多的耦合性就是new,只要与new搭上关系,我们便造成了一个耦合。反射机制帮助我们很好的解决了这个问题,若对反射机制不懂,可以看我的上一篇java反射机制
我们进入正题:
定义
工厂方法模式-也我们所谓的工厂模式
定义一个用于创建对象的接口,让其决定实例化哪个类
何时用到工厂模式
在前面已经大概说明了使用场景,总结就是在任何需要生产复杂对象的地方,都可以使用工厂模式,复杂对象适合使用工厂模式,用new就可以完成创建对象无需使用工厂模式。
通过使用工厂方法创建对象,我们可以避免客户端代码依赖于它所使用的接口的具体实现。客户端不再需要把对象创建的构造方法注入到自己的代码中去,客户端只需要调用工厂,由工厂来决定符合要求的子类的创建过程。此外,工厂方法还可以满足每次构造不同对象、对象的构造很复杂、对象的构造依赖具体环境等等需求。
UML
注意
重回出发点,我们之所以采用工厂模式,是为了解耦,其实有时我们使用工厂模式的时候,一不小心就变成了抽象工厂模式,而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
而这一切,我觉得没必要分的很清楚,我们只需要记住初衷,解耦。
相关文章推荐
- Android 设计模式:(四)工厂模式 —— 烘烤OO的精华
- 《Android之大话设计模式》--设计模式 创建型模式 第一章:简单工厂模式
- android设计模式-工厂模式
- android源码之工厂设计模式
- 设计模式--静态工厂设计模式在android中的使用
- Android设计模式系列(8)--SDK源码之工厂方法模式
- Android教程 -04 启动其它Activity,静态工厂设计模式传递数据
- Android开发之工厂模式初探
- Android 系统电话管理机制一--工厂模式和代理模式
- Android设计模式之工厂模式 Factory
- android开发中的DOM和SAX使用的工厂模式分析
- Android开发设计模式之——工厂模式
- Android设计模式系列(8)--SDK源码之工厂方法模式
- pyserial应用实例——对工厂模式下的Android手机收发AT命令
- 跟着Android学设计模式:工厂方法(Factory method)
- Android 设计模式:(四)工厂模式 —— 烘烤OO的精华
- android 设计模式-抽象工厂
- Android源码分析之工厂方法模式
- 浅谈应用工厂模式和单例在Android中实现业务隔离
- Android教程 -04 启动其它Activity,静态工厂设计模式传递数据