【设计模式与Android】工厂方法模式——化工女神的工厂

什么是工厂方法模式

 

所谓工厂方法模式,就是定义一个用于创建对象的接口,让子类决定实例化哪个类的设计模式。工厂模式适用于需要生成复杂对象的地方。

 

工厂方法模式的实现方式

 

这次我不打算用文学作品举例了,以前前几篇文章用《三国演义》和《水浒传》举例,某IT社区的技术编辑居然认为我是半路出家做Android程序员的文科生。既然这个设计模式以“工厂”命名,那么我们就用工厂打比方,我用我的化学知识证明我是高中学的理科,大学学的软件工程。国内某985院校的化工女神毕业后自主创业,开办了一个生产化肥的化工厂,主要产品有氮肥、磷肥、钾肥、×××(好像有什么奇怪的东西混进来了)。

首先定义一个抽象的化工厂类:

public abstract class ChemicalFactory {

    public abstract <T extends Chemical> T createChemical(Class<T> clz);

}

 

然后定义化工女神的化肥工厂:

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;
    }

}

 

接下来定义一个抽象的化肥类:

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】命令模式——军令如山


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章