美文网首页
工厂设计模式在Android开发中的应用

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

作者: 老师好我是小明同学 | 来源:发表于2020-01-11 23:27 被阅读0次
    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();
        }
    }
    
    

    相关文章

      网友评论

          本文标题:工厂设计模式在Android开发中的应用

          本文链接:https://www.haomeiwen.com/subject/nktiactx.html