Android 设计模式之工厂方法模式

在平常开发过程当中时常须要用到设计模式,可是设计模式有23种,如何将这些设计模式了然于胸而且能在实际开发过程当中应用得驾轻就熟呢?和我一块儿跟着《Android源码设计模式解析与实战》一书边学边应用吧!

设计模式系列文章

今天咱们要讲的是工厂方法模式


定义

定义一个用于建立对象的接口,让子类决定实例化哪一个类git

使用场景

  • 在任何须要生成复杂对象的地方,均可以使用工厂方法模式。复杂对象适合使用工厂模式,用new就能够完成建立的对象无需使用工厂模式

使用例子

  • Activity中的各个生命周期方法就能够看做是工厂方法

实现

通常分4大模块

  • 抽象产品
  • 具体产品
  • 抽象工厂
  • 具体的工厂

实现的要点

  • 工厂方法模式实现比较简单,方式也比较灵活,并不必定局限于上述的四个模块,能够根据须要来修改。好比只有一个工厂时能够省略抽象工厂

实现方式

工厂方法模式的实现主要是根据具体的实际状况来将多个产品的共性抽象出来,并定制具体的产品类,而后用工厂类来根据须要生产具体的产品类。下面经过一个简单的例子来看看工厂方法的实现

  • 抽象产品类
public abstract class Product {

    /**
     * 产品类的抽象方法,由具体的产品类去实现
     */
    public abstract void method();
}
复制代码
  • 具体产品类
//产品A
public class ProductA extends Product {

    @Override
    public void method() {
        System.out.println("产品A");
    }
}

//产品B
public class ProductB extends Product {

    @Override
    public void method() {
        System.out.println("产品B");
    }
}

复制代码
  • 抽象工厂
public abstract class Factory {

    /**
     * @param clz 产品对象类型
     * @return 具体的产品类型
     */
    public abstract <T extends Product> T createProduct(Class<T> clz);
}
复制代码
  • 具体工厂
public class ConcreteFactory extends Factory {

    @Override
    public <T extends Product> T createProduct(Class<T> clz) {
        Product p = null;
        try {
            p = (Product) Class.forName(clz.getName()).newInstance();

        }catch (Exception e) {
            e.printStackTrace();
        }

        return (T) p;
    }
}
复制代码
  • 调用
Factory factory = new ConcreteFactory();
Product productA = factory.createProduct(ProductA.class);
Product productB = factory.createProduct(ProductB.class);
productA.method();
productB.method();
复制代码
  • 上面的例子中,咱们的工厂方法采用了反射的方式来实现生产具体的产品对象,这样更加简洁,不用为每个产品都建立一个具体的工厂。

上面的例子比较简单,下面咱们看看书中做者的举例,利用工厂方法模式封装数据持久化过程

  • Android 中数据持久化为咱们提供了SharePreference和SQLite,还有普通的文件存储等方式。可是对数据的操做都是增删改查,能够把这些共同的操做抽象出来做为抽象产品类,而后每一种持久化方法做为具体产品。
  • 抽象产品中定义操做的方法,即增删改查
public abstract class AbstractIoHandler {

    /**
     * 添加我的信息
     *
     * @param id 身份证号码
     * @param name 姓名
     */
    public abstract void add(String id, String name);

    /**
     * 根据ID删除一条信息
     *
     * @param id 身份证
     */
    public abstract void remove(String id);

    /**
     * 更新我的信息
     *
     * @param id 身份证
     * @param name 姓名
     */
    public abstract void update(String id, String name);

    /**
     * 查询ID对应的信息
     *
     * @param id 身份证
     * @return 人名
     */
    public abstract String query(String id);

}
复制代码
  • 具体的产品,持久化的类型,好比利用文件来持久化
public class FileHandler extends AbstractIoHandler {

    @Override
    public void add(String id, String name){
        //业务处理
    }

    @Override
    public void remove(String id) {
        //业务处理
    }

    @Override
    public void update(String id, String name) {
        //业务处理
    }

    @Override
    public String query(String id) {
        return "";
    }
}
复制代码
  • 而后是咱们的工厂方法,这里仍然采用反射的方式
public class IoFactory {

    /**
     * 获取IoHandler
     *
     * @param clz AbstractIoHandler类型的类
     * @return AbstractIoHandler对象
     */
    public static <T extends AbstractIoHandler> T getIoHandler(Class<T> clz) {
        AbstractIoHandler handler = null;
        try {
            handler = (AbstractIoHandler) Class.forName(clz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return (T) handler;
    }
}
复制代码
  • 在须要进行数据持久化的地方调用工厂方法
AbstractIoHandler ioHandler = IoFactory.getIoHandler(FileHandler.class);
System.out.println(ioHandler.query("123456"));
复制代码
  • 这里的例子简化了不少,还有数据库SQLite以及SharePreference的持久化的类就没有写了。

总结

  • 工厂方法模式经过依赖抽象来达到解耦的效果,而且将实例化的任务交给子类去完成,有很是好的扩展性
  • 工厂方法模式用于生成比较复杂的对象。像咱们上面的例子中同样,当咱们有多个产品须要,咱们能够把产品共性的地方抽象出来,而后利用工厂方法生产具体须要的产品
  • 工厂方法模式的应用很是普遍,然而缺点也很明显,就是每次咱们为工厂方法添加新的产品时,都须要编写一个新的产品类,因此要根据实际状况来权衡是否要用工厂方法模式

源码地址:https://github.com/snowdream1314/DesignPatternsExamplesgithub


欢迎关注个人微信公众号,期待与你一块儿学习,一块儿交流,一块儿成长! 数据库

AntDream
相关文章
相关标签/搜索