工厂设计模式(二) - 简单工厂模式

前言

工厂设计模式系列文章
工厂设计模式(一)- 简介
工厂设计模式(二) - 简单工厂模式
工厂设计模式(三) - 工厂方法模式
工厂设计模式(四) - 抽象工厂模式
工厂设计模式(五) - 使用场景

1. 概述


这一节通过实例代码来演示,简单工厂模式的写法、优点及不足之处。

2. 简单工厂模式UML关系图如下


图片.png

3. 简单工厂模式代码如下


1>:定义一个接口IOHandler,用于数据存储的一些规范

/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/5/6 19:06
 * Version 1.0
 * Params:
 * Description:    数据存储的一些规范
*/

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);
    /*************end data start***************/

    /*************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***************/
}

2>:定义一个简单工厂设计模式IOHandlerFactory,用于创建数据存储

/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/5/6 19:04
 * Version 1.0
 * Params:
 * Description: 工厂设计模式 - 简单工厂设计模式
 *              用于创建数据存储
*/

public class IOHandlerFactory {

    public enum IOType{
        MEMORY , PREFERENCES , DISK
    }

    public static IOHandler createIOHandler(IOType ioType){
        switch (ioType){
            case MEMORY:
                // 在这里只是返回一个对象,有时候我们需要一系列的初始化参数
                // 这里边直接返回一个对象,做到了解耦,比如你不想用MemoryIOHandler,想用 MemoryIOHandler,可以直接把MemoryIOHandler 写好,
                // 然后直接返回 MemoryIOHandler对象即可
                 return new MemoryIOHandler() ;
            case PREFERENCES:
                 return new PreferencesIOHandler() ;
            case DISK:  // 新增case语句,新增磁盘 DISK存储
                return new DiskIOHandler() ;
            default:
                return null ;
        }
    }
}

3>:定义3个缓存策略,分别是内存缓存、磁盘缓存、本地SP缓存,都是让这3个类实现 IOHandler;

  • a:内存缓存MemoryIOHandler,实现 IOHandler接口,代码如下:
/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/5/6 19:08
 * Version 1.0
 * Params:
 * Description:    内存缓存
*/

public class MemoryIOHandler implements IOHandler {

    // 存在 运行内存中,LruCache原理其实就是 HashMap集合 ,存储图片或者其他类型都是可以的
    private static LruCache<String , Object> mCache = new LruCache<>(10*1024*1024) ;  // 运行内存一般为app大小的 1/8

    @Override
    public void save(String key, String value) {
        mCache.put(key , value) ;
    }

    @Override
    public void save(String key, double value) {

    }

    @Override
    public void save(String key, int value) {

    }

    @Override
    public void save(String key, long value) {

    }

    @Override
    public void save(String key, boolean value) {

    }

    @Override
    public void save(String key, Object value) {

    }

    @Override
    public String getString(String key) {
        return (String) mCache.get(key);
    }

    @Override
    public double getDouble(String key, double defaultValue) {
        return 0;
    }

    @Override
    public int getInt(String key, int defaultValue) {
        return 0;
    }

    @Override
    public long getLong(String key, long defaultValue) {
        return 0;
    }

    @Override
    public boolean getBoolean(String key, boolean defaultValue) {
        return false;
    }

    @Override
    public Object getObject(String key) {
        return null;
    }
}
  • b:磁盘缓存DiskIOHandler,实现 IOHandler接口,代码如下:
/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/5/12 8:57
 * Version 1.0
 * Params:
 * Description:    磁盘缓存
*/

public class DiskIOHandler implements IOHandler{
    @Override
    public void save(String key, String value) {

    }

    @Override
    public void save(String key, double value) {

    }

    @Override
    public void save(String key, int value) {

    }

    @Override
    public void save(String key, long value) {

    }

    @Override
    public void save(String key, boolean value) {

    }

    @Override
    public void save(String key, Object value) {

    }

    @Override
    public String getString(String key) {
        return null;
    }

    @Override
    public double getDouble(String key, double defaultValue) {
        return 0;
    }

    @Override
    public int getInt(String key, int defaultValue) {
        return 0;
    }

    @Override
    public long getLong(String key, long defaultValue) {
        return 0;
    }

    @Override
    public boolean getBoolean(String key, boolean defaultValue) {
        return false;
    }

    @Override
    public Object getObject(String key) {
        return null;
    }
}
  • c:本地SP缓存 PreferenceIOHandler,实现 IOHandler接口,代码如下:
本地SP缓存
*/

public class PreferencesIOHandler implements IOHandler {
    @Override
    public void save(String key, String value) {
        PreferencesUtils.getInstance().saveString(key , value) ;
    }

    @Override
    public void save(String key, double value) {

    }

    @Override
    public void save(String key, int value) {

    }

    @Override
    public void save(String key, long value) {

    }

    @Override
    public void save(String key, boolean value) {

    }

    @Override
    public void save(String key, Object value) {

    }

    @Override
    public String getString(String key) {
        return PreferencesUtils.getInstance().getString(key);
    }

    @Override
    public double getDouble(String key, double defaultValue) {
        return 0;
    }

    @Override
    public int getInt(String key, int defaultValue) {
        return 0;
    }

    @Override
    public long getLong(String key, long defaultValue) {
        return 0;
    }

    @Override
    public boolean getBoolean(String key, boolean defaultValue) {
        return false;
    }

    @Override
    public Object getObject(String key) {
        return null;
    }
}

4>:最后在MainActivity中测试,直接通过 工厂 IOHandlerFactory,传入对应的缓存方式名称,就可以切换对应缓存方式,代码如下:

/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/5/12 9:23
 * Version 1.0
 * Params:
 * Description:    简单工厂测试
*/

public class MainActivity extends AppCompatActivity {

    private TextView mTextView;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView = (TextView) findViewById(R.id.test_tv);
        // 通过IOHandlerFactory工厂,传如对应缓存的名称,比如MEMORY、PREFERENCES、DISK,就可以切换对应的缓存方式
        IOHandler ioHandler = IOHandlerFactory.createIOHandler(IOHandlerFactory.IOType.MEMORY);
        ioHandler.save("userName" , "北京 - Novate");
        ioHandler.save("userAge" , "920925");
    }

    public void click(View view){
        IOHandler ioHandler = IOHandlerFactory.createIOHandler(IOHandlerFactory.IOType.MEMORY);
        String userName = ioHandler.getString("userName") ;
        String userAge = ioHandler.getString("userAge") ;
        mTextView.setText("userName = " + userName + " , userAge = " + userAge) ;
    }
}

4. 测试效果如下图所示


图片.png

5. 简单工厂模式特点


1>:简单工厂模式优点:

  • a:解耦:如果需要哪种缓存方式,可以在MainActivity中直接通过 IOHandlerFactory根据传递的MEMORY、PREFERENCES、DISK不同参数,达到切换对应的缓存方式。
    比如我现在正在用的是MEMORY缓存方式,下一次我想用DISK缓存方式,就可以直接去切换对应参数即可,过一段时间如果我又想用MEMORY缓存方式的话,我又可以切换回来,这样就不用修改原来的代码,直接切换对应缓存方式,就起到了解耦作用;
  • b:最少知识原则:
    最少知识原则就是:你只需要告诉我把数据缓存到哪里:

比如缓存到MEMORY,那么我就在MainActivty中切换到IOHandlerFactory.IOType.MEMORY就行,其他的我不管;
比如缓存到PREFERENCES,那么我就在MainActivty中切换到IOHandlerFactory.IOType.PREFERENCES就行,其他的我不管;
比如缓存到DISK,那么我就在MainActivty中切换到IOHandlerFactory.IOType.DISK就行,其他的我不管;

2>:简单工厂模式缺点:

如果我新增了一种存储方式,比如我新增了 DiskIOHandler,就需要在IOHandlerFactory中新增加 case语句,说白了,就是需要修改我们之前的代码,这样做并不是特别好;

6. 写代码原则


我们写代码的原则就是:在日后需求修改、功能变动、新增网络请求、缓存处理等等这些东西,遵循的原则就是尽量的不去动原来的代码,那么如何做到这一点,那么我会在下一节给大家来讲解下如何做到新增缓存方式,并且不去修改原来的代码;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容