什么是工厂方法模式
所谓工厂方法模式,就是定义一个用于创建对象的接口,让子类决定实例化哪个类的设计模式。工厂模式适用于需要生成复杂对象的地方。
工厂方法模式的实现方式
这次我不打算用文学作品举例了,以前前几篇文章用《三国演义》和《水浒传》举例,某IT社区的技术编辑居然认为我是半路出家做Android程序员的文科生。既然这个设计模式以“工厂”命名,那么我们就用工厂打比方,我用我的化学知识证明我是高中学的理科,大学学的软件工程。国内某985院校的化工女神毕业后自主创业,开办了一个生产化肥的化工厂,主要产品有氮肥、磷肥、钾肥、×××(好像有什么奇怪的东西混进来了)。
首先定义一个抽象的化工厂类:public abstract classChemicalFactory {public abstractTcreateChemical(Class clz);}
然后定义化工女神的化肥工厂:public classGoddessChemicalFactoryextendsChemicalFactory {@OverridepublicTcreateChemical(Class clz) {Chemicalchemical=null;try{chemical= (Chemical)Class.forName(clz.getName()).newInstance();}catch(Exception e){e.printStackTrace();}return(T)chemical;}}
接下来定义一个抽象的化肥类:public abstract classChemical {/*** 化肥特征之一——投放到地上*/public abstract voidtoGround();/*** 化肥特征之二——变成气体后才会起作用*/public abstract voidbecomeGas();}
定义氮肥类:public classNChemicalextendsChemical {@Overridepublic voidtoGround() {Log.e("NChemical","氮肥被投放到白菜地里");}@Overridepublic voidbecomeGas() {Log.e("NChemical","氮肥释放含N元素的气体被白菜的叶子吸收");}}
定义磷肥类:public classPChemicalextendsChemical {@Overridepublic voidtoGround() {Log.e("PChemical","磷肥被投放到西红柿地里");}@Overridepublic voidbecomeGas() {Log.e("PChemical","磷肥释放含P元素的气体被西红柿的果实吸收");}}
定义钾肥类:public classKChemicalextendsChemical {@Overridepublic voidtoGround() {Log.e("KChemical","钾肥被投放到胡萝卜地里");}@Overridepublic voidbecomeGas() {Log.e("KChemical","钾肥释放含K元素的气体被胡萝卜的根系吸收");}}
定义×××类:public classExplosiveextendsChemical {@Overridepublic voidtoGround() {Log.e("Explosive","×××被投放到敌人阵地里");}@Overridepublic voidbecomeGas() {Log.e("Explosive","×××释放温度高的气体(火焰)和速度快的气体(冲击波)被敌人的身体吸收");}}
开工大吉:GoddessChemicalFactory factory =newGoddessChemicalFactory();NChemical nChemical = factory.createChemical(NChemical.class);nChemical.toGround();nChemical.becomeGas();PChemical pChemical = factory.createChemical(PChemical.class);pChemical.toGround();pChemical.becomeGas();KChemical kChemical = factory.createChemical(KChemical.class);kChemical.toGround();kChemical.becomeGas();Explosive explosive = factory.createChemical(Explosive.class);explosive.toGround();explosive.becomeGas();
化工女神的化肥工厂日进斗金,读化工女神的故事的程序员学会了工厂方法模式,这位技术编辑也不再怀疑作者是文科生。
Android源码中的工厂方法模式
(1)Iterable及其子类
ArrayList、LinkedList和HashSet等常见数据结构都实现了Iterable接口,这就是典型的工厂方法模式。
(2)Activity的onCreate
没错,就是Android初学者第一眼就见到的onCreate,任何Activity都是Activity的子类,而任何控件都是View的子类,onCreate方法是最容易被遗忘的工厂方法模式。
Android开发中如何利用工厂方法模式
(1)工厂方法模式利用依赖注入以达到解耦、复用和方便后期维护拓展的目的。工厂方法模式应用广泛,我提示一个最经典的应用场景:Android数据存储中的本地存储可以细分为File、SharedPreferences和SQLite三种,可以继承有增、删、改、查四种方法的抽象产品类。
需要注意的几个问题
(1)工厂方法模式的缺点是每次添加新的产品时就要编写一个新的产品类,同时还要引入抽象层,这必然会导致类结构的复杂化,所以工厂方法模式不适用于结构太简单的情况。
本系列其他博客