什么是工厂方法模式程序员
所谓工厂方法模式,就是定义一个用于建立对象的接口,让子类决定实例化哪一个类的设计模式。工厂模式适用于须要生成复杂对象的地方。设计模式
工厂方法模式的实现方式数据结构
此次我不打算用文学做品举例了,之前前几篇文章用《三国演义》和《水浒传》举例,某IT社区的技术编辑竟然认为我是半路出家作Android程序员的文科生。既然这个设计模式以“工厂”命名,那么咱们就用工厂打比方,我用个人化学知识证实我是高中学的理科,大学学的软件工程。国内某985院校的化工女神毕业后自主创业,开办了一个生产化肥的化工厂,主要产品有氮肥、磷肥、钾肥、×××(好像有什么奇怪的东西混进来了)。ide
首先定义一个抽象的化工厂类:spa
public abstract class ChemicalFactory {
public abstract <T extends Chemical> T createChemical(Class<T> clz);
}设计 |
而后定义化工女神的化肥工厂:orm
public class GoddessChemicalFactory extends ChemicalFactory {
@Override public <T extends Chemical> T createChemical(Class<T> clz) { Chemical chemical = null; try { chemical = (Chemical)Class.forName(clz.getName()).newInstance(); }catch (Exception e){ e.printStackTrace(); } return (T) chemical; }
}对象 |
接下来定义一个抽象的化肥类:blog
public abstract class Chemical {
/** * 化肥特征之一——投放到地上 */ public abstract void toGround();
/** * 化肥特征之二——变成气体后才会起做用 */ public abstract void becomeGas();
}继承 |
定义氮肥类:
public class NChemical extends Chemical { @Override public void toGround() { Log.e("NChemical","氮肥被投放到白菜地里"); }
@Override public void becomeGas() { Log.e("NChemical","氮肥释放含N元素的气体被白菜的叶子吸取"); } } |
定义磷肥类:
public class PChemical extends Chemical { @Override public void toGround() { Log.e("PChemical","磷肥被投放到西红柿地里"); }
@Override public void becomeGas() { Log.e("PChemical","磷肥释放含P元素的气体被西红柿的果实吸取"); } } |
定义钾肥类:
public class KChemical extends Chemical { @Override public void toGround() { Log.e("KChemical","钾肥被投放到胡萝卜地里"); }
@Override public void becomeGas() { Log.e("KChemical","钾肥释放含K元素的气体被胡萝卜的根系吸取"); } } |
定义×××类:
public class Explosive extends Chemical { @Override public void toGround() { Log.e("Explosive","×××被投放到敌人阵地里"); }
@Override public void becomeGas() { Log.e("Explosive","×××释放温度高的气体(火焰)和速度快的气体(冲击波)被敌人的身体吸取"); } } |
开工大吉:
GoddessChemicalFactory factory = new GoddessChemicalFactory();
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)工厂方法模式的缺点是每次添加新的产品时就要编写一个新的产品类,同时还要引入抽象层,这必然会致使类结构的复杂化,因此工厂方法模式不适用于结构太简单的状况。
本系列其余博客
【设计模式与Android】抽象工厂模式——嵌合体克隆工厂
【设计模式与Android】策略模式——锦囊里的上策中策下策
【设计模式与Android】状态模式——一我的的两幅面孔
【设计模式与Android】责任链模式——曹瞒兵败走华容
【设计模式与Android】命令模式——军令如山