美文网首页
工厂设计模式 - 讲解

工厂设计模式 - 讲解

作者: cao苗子 | 来源:发表于2019-10-25 15:01 被阅读0次

1.模式定义
定义一个创建对象的接口,让子类决定实例化哪个类,而对象的创建统一交给工厂去生成,有良好的封装性,
既做到了解耦也保证了最少知识原则。

任何设计模式都是用来解决某一特定场景问题的一种思想,当在开发中遇到某一问题的时候,
就想想能不能用某一种设计模式来解决!

2.简单工厂模式

3.工厂方法模式
一个工厂一般生成相对应的产品
存在问题:这个也存在问题,随着功能的增加,IOFactory和IOHandler会越来越多 会导致代码冗余,
但是功能有基本差不多

4.抽象工厂模式
定义跟 BitmapFactory 比较像 也和简单工厂比较像。通过特定的方法返回单一的对象

下面是一个 数据存储列子:
构建数据存储工厂类:用于创建 内存存储类,磁盘存储类,SP存储类
CacheFactory

package com.miaozi.baselibrary.cache;

/**
 * created by panshimu
 * on 2019/10/25
 *  数据存储工厂类
 */
public class CacheFactory {
    private static volatile CacheFactory mCacheFactory;
    private CacheHandler mPreferencesCacheHolder,mMemoryCacheHolder,mDiskCacheHolder;
    private CacheFactory(){
    }
    public static CacheFactory getInstance(){
        if(mCacheFactory == null){
            synchronized (CacheFactory.class){
                if(mCacheFactory == null){
                    mCacheFactory = new CacheFactory();
                }
            }
        }
        return mCacheFactory;
    }
    public CacheHandler createCacheHandler(Class<? extends CacheHandler> cacheHandlerClass){
        if(cacheHandlerClass != null){
            try {
                return cacheHandlerClass.newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    public CacheHandler getPreferencesCacheHolder() {
        if(mPreferencesCacheHolder == null){
            mPreferencesCacheHolder = createCacheHandler(PreferenceCacheHandler.class);
        }
        return mPreferencesCacheHolder;
    }
    public CacheHandler getMemoryCacheHolder() {
        if(mMemoryCacheHolder == null){
            mMemoryCacheHolder = createCacheHandler(MemoryCacheHandler.class);
        }
        return mMemoryCacheHolder;
    }
    public CacheHandler getDiskCacheHolder() {
        if(mDiskCacheHolder == null){
            mDiskCacheHolder = createCacheHandler(DiskCacheHandler.class);
        }
        return mDiskCacheHolder;
    }

    /**
     * 默认
     * @return
     */
    public CacheHandler getDefaultCacheHolder(){
        return getPreferencesCacheHolder();
    }
}

CacheHandler 定义数据存储的规范

package com.miaozi.baselibrary.cache;

/**
 * created by panshimu
 * on 2019/10/25
 * 定义数据存储的规范
 */
public interface CacheHandler {

    void put(String key, String value);
    void put(String key, int value);
    void put(String key, double value);
    void put(String key, float value);
    void put(String key, long value);
    void put(String key, boolean value);
    void put(String key, Object value);

    String get(String key, String defaultValue);
    int get(String key, int defaultValue);
    double get(String key, double defaultValue);
    float get(String key, float defaultValue);
    long get(String key, long defaultValue);
    boolean get(String key, boolean defaultValue);
    Object get(String key, Object defaultValue);

}

PreferencesUtils SP工具类

package com.miaozi.baselibrary.cache;

import android.content.Context;
import android.content.SharedPreferences;

/**
 * created by panshimu
 * on 2019/10/25
 */
public class PreferencesUtils{
    private static final String CACHE_TAG = "miaozi";
    private static volatile PreferencesUtils mPreferencesUtils;
    private SharedPreferences mPreferences;
    private SharedPreferences.Editor mEditor;
    private PreferencesUtils(){
    }
    public static PreferencesUtils getInstance(){
        if(mPreferencesUtils == null){
            synchronized (PreferencesUtils.class){
                if(mPreferencesUtils == null){
                    mPreferencesUtils = new PreferencesUtils();
                }
            }
        }
        return mPreferencesUtils;
    }
    public void init(Context context){
        mPreferences = context.getApplicationContext().getSharedPreferences(CACHE_TAG,Context.MODE_PRIVATE);
        mEditor = mPreferences.edit();
    }

    public void put(String key, String value) {
        if(mEditor == null)
            throw new RuntimeException("请先初始化 init() ");
        mEditor.putString(key,value);
        mEditor.commit();
    }

    public void put(String key, int value) {
        if(mEditor == null)
            throw new RuntimeException("请先初始化 init() ");
        mEditor.putInt(key,value);
        mEditor.commit();
    }

    public void put(String key, float value) {
        if(mEditor == null)
            throw new RuntimeException("请先初始化 init() ");
        mEditor.putFloat(key,value);
        mEditor.commit();
    }

    public void put(String key, long value) {
        if(mEditor == null)
            throw new RuntimeException("请先初始化 init() ");
        mEditor.putLong(key,value);
        mEditor.commit();
    }

    public void put(String key, boolean value) {
        if(mEditor == null)
            throw new RuntimeException("请先初始化 init() ");
        mEditor.putBoolean(key,value);
        mEditor.commit();
    }

    public String get(String key, String defaultValue) {
        if(mPreferences == null)
            throw new RuntimeException("请先初始化 init() ");
        return mPreferences.getString(key,defaultValue);
    }

    public int get(String key, int defaultValue) {
        if(mPreferences == null)
            throw new RuntimeException("请先初始化 init() ");
        return  mPreferences.getInt(key,defaultValue);
    }

    public float get(String key, float defaultValue) {
        if(mPreferences == null)
            throw new RuntimeException("请先初始化 init() ");
        return  mPreferences.getFloat(key,defaultValue);
    }

    public long get(String key, long defaultValue) {
        if(mPreferences == null)
            throw new RuntimeException("请先初始化 init() ");
        return  mPreferences.getLong(key,defaultValue);
    }

    public boolean get(String key, boolean defaultValue) {
        if(mPreferences == null)
            throw new RuntimeException("请先初始化 init() ");
        return  mPreferences.getBoolean(key,defaultValue);
    }

}

PreferencesHolder SP辅助类

package com.miaozi.baselibrary.cache;

/**
 * created by panshimu
 * on 2019/10/25
 */
public abstract class PreferencesHolder implements CacheHandler {
    @Override
    public void put(String key, String value) {
        PreferencesUtils.getInstance().put(key,value);
    }

    @Override
    public void put(String key, int value) {
        PreferencesUtils.getInstance().put(key,value);
    }

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

    @Override
    public void put(String key, float value) {
        PreferencesUtils.getInstance().put(key,value);
    }

    @Override
    public void put(String key, long value) {
        PreferencesUtils.getInstance().put(key,value);
    }

    @Override
    public void put(String key, boolean value) {
        PreferencesUtils.getInstance().put(key,value);
    }

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

    @Override
    public String get(String key, String defaultValue) {
        return PreferencesUtils.getInstance().get(key,defaultValue);
    }

    @Override
    public int get(String key, int defaultValue) {
        return PreferencesUtils.getInstance().get(key,defaultValue);
    }

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

    @Override
    public float get(String key, float defaultValue) {
        return PreferencesUtils.getInstance().get(key,defaultValue);
    }

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

    @Override
    public boolean get(String key, boolean defaultValue) {
        return PreferencesUtils.getInstance().get(key,defaultValue);
    }

    @Override
    public Object get(String key, Object defaultValue) {
        return null;
    }
}

PreferenceCacheHandler SP 工厂实现类

package com.miaozi.baselibrary.cache;

/**
 * created by panshimu
 * on 2019/10/25
 *  SP 存储
 */
public class PreferenceCacheHandler extends PreferencesHolder {
    @Override
    public void put(String key, String value) {
        super.put(key, value);
    }

    @Override
    public void put(String key, int value) {
        super.put(key, value);
    }

    @Override
    public boolean get(String key, boolean defaultValue) {
        return super.get(key, defaultValue);
    }

    @Override
    public void put(String key, float value) {
        super.put(key, value);
    }

    @Override
    public void put(String key, long value) {
        super.put(key, value);
    }

    @Override
    public void put(String key, boolean value) {
        super.put(key, value);
    }

    @Override
    public float get(String key, float defaultValue) {
        return super.get(key, defaultValue);
    }

    @Override
    public int get(String key, int defaultValue) {
        return super.get(key, defaultValue);
    }

    @Override
    public String get(String key, String defaultValue) {
        return super.get(key, defaultValue);
    }

    @Override
    public long get(String key, long defaultValue) {
        return super.get(key, defaultValue);
    }
}

MemoryCacheHandler 内存工厂实现类

package com.miaozi.baselibrary.cache;

/**
 * created by panshimu
 * on 2019/10/25
 * 内存存储
 */
public class MemoryCacheHandler implements CacheHandler {

    @Override
    public void put(String key, String value) {

    }

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

    }

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

    }

    @Override
    public void put(String key, float value) {

    }

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

    }

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

    }

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

    }

    @Override
    public String get(String key, String defaultValue) {
        return null;
    }

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

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

    @Override
    public float get(String key, float defaultValue) {
        return 0;
    }

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

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

    @Override
    public Object get(String key, Object defaultValue) {
        return null;
    }
}

DiskCacheHandler 磁盘存储工厂实现类

package com.miaozi.baselibrary.cache;

/**
 * created by panshimu
 * on 2019/10/25
 *  磁盘存储
 */
public class DiskCacheHandler implements CacheHandler {

    @Override
    public void put(String key, String value) {

    }

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

    }

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

    }

    @Override
    public void put(String key, float value) {

    }

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

    }

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

    }

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

    }

    @Override
    public String get(String key, String defaultValue) {
        return null;
    }

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

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

    @Override
    public float get(String key, float defaultValue) {
        return 0;
    }

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

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

    @Override
    public Object get(String key, Object defaultValue) {
        return null;
    }
}

不管你想添加什么存储模式 只需要在工厂里面创建就行。

好了。

相关文章

  • 设计模式第三篇-创建型模式【工厂模式】

    设计模式案例分析-github 一、前言 工厂模式分为工厂方法(又称简单工厂)模式、抽象工厂模式。为方便讲解,工厂...

  • 工厂设计模式 - 讲解

    1.模式定义定义一个创建对象的接口,让子类决定实例化哪个类,而对象的创建统一交给工厂去生成,有良好的封装性,既做到...

  • 抽象工厂模式-示例

    接上文抽象工厂 模式模式讲解,本文主要从具体示例来复现该设计模式: 由上文可知,抽象工厂模式的UML图如下: 【1...

  • 设计模式四、抽象工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 抽象工厂模式 ...

  • 设计模式之工厂模式

    设计模式之工厂模式 标签(空格分隔): 设计模式 工厂模式 设计模式的感念 设计模式的应用 工厂设计模式的产生 工...

  • 设计模式三、工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 工厂模式 在一...

  • 工厂模式

    java设计模式-工厂模式 工厂模式: 工厂模式是java设计模式里最常用的设计模式之一。 工厂模式属于创建型模式...

  • 设计模式-工厂模式和抽象工厂-Factory

    本文讲解GOF-23种设计模式其中的工厂方法模式和抽象工厂模式。由于本人爱国情怀高涨,所以本文都以长安汽车作为示例...

  • 单件设计模式

    一、定义 设计模式 设计模式就是一种更好的编写代码方案。 常见设计模式 工厂设计模式、抽象工厂设计模式、抽象工厂设...

  • iOS设计模式(三)之抽象工厂模式

    设计模式系列传送门 iOS设计模式(一)之简单工厂模式iOS设计模式(二)之工厂模式iOS设计模式(三)之抽象工厂...

网友评论

      本文标题:工厂设计模式 - 讲解

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