工厂设计模式在Android开发中的应用

1. 模式定义

定义一个创建对象的接口,让子类决定实例化哪个类,而对象的创建统一交由工厂去生成,有良好的封装性,既做到了解耦也保证了最少知识原则。工厂就是用来生成对象的,把对象的实例化和初始化封装起来。
下面以数据存储为例介绍工厂设计模式的用法。

2. 简单工厂模式

定义数据操作接口(产品接口)

public interface IOHandler {
    /*************save data start***************/
    void save(String key,String value);
    void save(String key,double value);
    void save(String key,int value);
    void save(String key,long value);
    void save(String key,boolean value);
    void save(String key,Object value);
    /*************save data end***************/

    /*************get data start***************/
    String getString(String key);
    double getDouble(String key,double defaultValue);
    int getInt(String key,int defaultValue);
    long getLong(String key,long defaultValue);
    boolean getBoolean(String key,boolean defaultValue);
    Object getObject(String key);
    /*************get data end***************/
}

具体数据操作的方式(产品)

public class PreferencesIOHandler implements IOHandler{
    ...
}

public class MemoryIOHandler implements IOHandler{
    ...
}

public class DiskIOHandler implements IOHandler{
    ...
}

工厂类生成数据的具体操作方式类(工厂来组装产品)

public class IOHandlerFactory {
    public enum IOType{
        MEMORY,PREFERENCES,DISK
    }
   
    public static IOHandler createIOHandler(IOType ioType){
        switch (ioType){
            case MEMORY:
                return new MemoryIOHandler();
            case PREFERENCES:
                return new PreferencesIOHandler();
            case DISK:
                return new DiskIOHandler();
            default:
                return null;
        }
    }
}

思考:比如我新增一个新的方式存储,要怎么改?需要新增类型,需要添加 case。这需要改动原来的很多代码

3. 工厂方法模式

一个具体操作的实现对应一个工厂的方法来生成

工厂方法

public interface IOFactory {
     IOHandler createIOHandler();
}

每种操作实现的方式都用一个工厂来生成,一个 IOFactory -> 一个 IOHandler(一个工厂一般生产相对应的产品,)

public class PreferencesIOFactory implements IOFactory{
    @Override
    public IOHandler createIOHandler() {
        return new PreferencesIOHandler();
    }
}

public class MemoryIOFactory implements IOFactory{
    @Override
    public IOHandler createIOHandler() {
        return new MemoryIOHandler();
    }
}

public class DiskIOFactory implements IOFactory{
    @Override
    public IOHandler createIOHandler() {
        return new DiskIOHandler();
    }
}

思考:随着功能的扩展,我们的 IOFactory 类会不断的增加,而且逻辑基本一样,在一定程度代码冗余度高

4. 抽象工厂模式

通过特定的方法返回单一的对象,可利用泛型

public class IOHandlerFactory {
    /**
     * 利用泛型生成产品
     */
    public static IOHandler createIOHandler(Class<? extends IOHandler> ioHandlerClass){
        try {
            return ioHandlerClass.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new PreferencesIOHandler();
    }

    /**
     * 获取 运行内存 存储
     * @return
     */
    public static IOHandler getMemoryIOHandler(){
        return createIOHandler(MemoryIOHandler.class);
    }

    /**
     * 获取 磁盘 存储
     * @return
     */
    public static IOHandler getDiskIOHandler(){
        return createIOHandler(DiskIOHandler.class);
    }

    /**
     * 获取 SP 存储
     * @return
     */
    public static IOHandler getPreferencesIOHandler(){
        return createIOHandler(PreferencesIOHandler.class);
    }

    /**
     * 获取 默认 存储
     * @return
     */
    public static IOHandler getDefaultIOHandler(){
        return getPreferencesIOHandler();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值