美文网首页
2019-04-11设计模式-工厂模式

2019-04-11设计模式-工厂模式

作者: 猫KK | 来源:发表于2019-04-11 19:48 被阅读0次

    通过让子类决定该创建的对象是什么,来达到将对象创建过程封装的目的。一般分为三类:简单工厂模式、工厂方法模式、抽象工厂模式

    这里已缓存数据为例,缓存数据一般可在内存中缓存,SharedPreferences 中缓存,磁盘缓存等....

    简单工厂模式

    首先定义一个数据保存取出接口

    public interface IOHandler {
        void saveString(String key, String value);
    
        String getString(String key, String defaultValue);
    }
    

    实现接口,书写具体的操作类

    //实现接口,写具体的操作
    public class SPHandler implements IOHandler {
    
        @Override
        public void saveString(String key, String value) {
             //SPUtils 是封装的一个 SharedPreferences 工具类
            SPUtils.getInstance().saveString(key, value).commit();
        }
    
        @Override
        public String getString(String key, String defaultValue) {
            return SPUtils.getInstance().getString(key, defaultValue);
        }
    }
    

    书写Factory类,封装IOHandler 创建过程

    
    public class IOHandlerFactory {
        //定义一个枚举类,来区分该创建什么
        public enum TYPE {
            MEMORY, SHAREDPREFERENCES
        }
    
        public static IOHandler create(TYPE type) {
            //根据不同的 type 创建不同的对象
            switch (type) {
                case MEMORY:
                    return new MemoryHandler();
                case SHAREDPREFERENCES:
                    return new SPHandler();
                default:
                    return new SPHandler();
            }
        }
    }
    

    在Activity中使用

      
    class FactoryActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_factory)
    
            //简单工厂模式
            var ioHandler = IOHandlerFactory.create(IOHandlerFactory.TYPE.SHAREDPREFERENCES)
            ioHandler.saveString("name", "liangshiguan")
            ioHandler.saveString("age", "23")
    
            factory_tv.setOnClickListener {
                textClick()
            }
        }
    
        private fun textClick() {
            //简单工厂模式
            var ioHandler = IOHandlerFactory.create(IOHandlerFactory.TYPE.SHAREDPREFERENCES)
            var name = ioHandler.getString("name", "")
            var age = ioHandler.getString("age", "")
    
            factory_tv.setText("name------>" + name + "    age------->" + age)
        }
    }
    

    到这里,一个简单的工厂模式就写完了,如果我们需要修改保存的方式,不需要在重新new对象只需要修改TYPE。这样就不需要管对象的创建过程。然后这种模式还有一些不足:假如又增加了一种缓存方式,就需要在IOHandlerFactory中的枚举类中增加一个type,还需要在 create 方法中多增加一条 case,需要修改的有点多,所以出现下面这种写法

    工厂方法模式

    定义工厂需要的操作

    public interface IOFactory {
        IOHandler create();
    }
    

    定义SharedPreferences 的工厂,专门用来实例SPHandler对象

    public class SPFactory implements IOFactory {
        @Override
        public IOHandler create() {
            //直接实例化 SPHandler
            return new SPHandler();
        }
    }
    

    在Activity中使用变成

    
    class FactoryActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_factory)
    
            //工厂方法模式
            var factory = SPFactory()
            var ioHandler = factory.create()
            ioHandler.saveString("name", "liangshiguan")
            ioHandler.saveString("age", "23")
            factory_tv.setOnClickListener {
                textClick()
            }
        }
    
        private fun textClick() {
            //工厂方法模式
            var factory = SPFactory()
            var ioHandler = factory.create()
            var name = ioHandler.getString("name", "")
            var age = ioHandler.getString("age", "")
            factory_tv.setText("name------>" + name + "    age------->" + age)
        }
    }
    

    这样,在增加新的缓存方式时,只需要增加对应的IOFactory子类和IOHandler子类就可以,而不需要修改原来的代码。然后这样子还是有一点不好,每增加一种方式就增加两个类,如果方式多了,类会变的很多,这样维护起来也很麻烦,所以又出现了下面的写法

    抽象工厂模式

    定义抽象工厂接口

    public interface IOFactory {
        IOHandler create(Class<? extends IOHandler> clazz);
    }
    

    书写工厂的实现类

    
    public class IOHandlerFactory implements IOFactory {
        //使用反射创建对象
        @Override
        public IOHandler create(Class<? extends IOHandler> clazz) {
            try {
                return clazz.newInstance();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            }
            return new SPHandler();
        }
    
        //创建方法,获取getSPFactory 的对象
        public IOHandler getSPFactory() {
            return create(SPHandler.class);
        }
    
        public IOHandler getMemoryFactory() {
            return create(MemoryHandler.class);
        }
    }
    

    在Activity中使用

    
    class FactoryActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_factory)
    
            //抽象工厂
            var ioHandler = IOHandlerFactory().memoryFactory
            ioHandler.saveString("name", "liangshiguan")
            ioHandler.saveString("age", "23")
            factory_tv.setOnClickListener {
                textClick()
            }
        }
    
        private fun textClick() {
    
            //抽象工厂
            var ioHandler = IOHandlerFactory().memoryFactory
            var name = ioHandler.getString("name", "")
            var age = ioHandler.getString("age", "")
            factory_tv.setText("name------>" + name + "    age------->" + age)
        }
    }
    

    这样,就可以少写一些 Factory 类(看起来和简单工厂每什么区别....)

    相关文章

      网友评论

          本文标题:2019-04-11设计模式-工厂模式

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