工厂设计模式(四) - 抽象工厂模式

前言

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

1. 抽象工厂模式定义?


  • 抽象工厂模式跟 BitmapFactory、简单工厂模式比较像,都是通过特定的方法返回单一的对象,意思就是:

首先:
a:定义一个总接口, IOFactory,在里边写 createIOHandler(),用于生成3个存储方式的工厂;

然后:让IOHandlerFactory 实现 IOFactory接口,重写createIOHandler()方法;
a:在IOHandlerFactory工厂中,定义获取运行内存存储方法,用于返回运行内存存储;
b:在IOHandlerFactory工厂中,定义获取运行SP方法,用于返回SP存储;
c:在IOHandlerFactory工厂中,定义获取磁盘存储方法,用于返回磁盘存储;

2. 抽象工厂模式UML关系图如下


工厂设计模式(四) - 抽象工厂模式_第1张图片
图片.png

3. 具体代码如下


1>:首先定义一个 接口IOFactory,用于生成这3个工厂,代码如下:

/**
 * Email: [email protected]
 * Created by Novate 2018/5/6 19:04
 * Version 1.0
 * Params:
 * Description:    生成所有产品的的工厂接口 - 这里是生成Memory、Disk、Preference3个工厂的接口
 *
*/

public interface IOFactory {
    IOHandler createIOHandler(Class ioHandlerClass) ;
}

2>:然后定义一个 IOHandlerFactory,实现 IOFactory接口,把这个类写成单例模式,然后针对于这3种存储方式分别写3个方法,getMemoryIOHandler()、getPreferenceIOHandler()、getDiskIOHandler(),再写一个默认调用的方法getDefaultIOHandler(),代码如下:

/**
 * Email: [email protected]
 * Created by Novate 2018/5/12 10:57
 * Version 1.0
 * Params:
 * Description:    工厂设计模式 - 单例写法
*/
public class IOHandlerFactory implements IOFactory {
    
    private static volatile  IOHandlerFactory mInstance;
    private IOHandler mMemoryIOHandler,mPreferencesIOHandler;

    private IOHandlerFactory(){

    }

    public static IOHandlerFactory getInstance(){
        if(mInstance == null){
            synchronized (IOHandlerFactory.class){
                if(mInstance == null){
                    mInstance = new IOHandlerFactory();
                }
            }
        }
        return mInstance;
    }

    /**
     * 创建IOHandler
     */
    public IOHandler createIOHandler(Class ioHandlerClass){
        try {
            return ioHandlerClass.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new PreferencesIOHandler();
    }

    /**
     * 获取 运行内存 存储
     */
    public IOHandler getMemoryIOHandler(){
        if(mMemoryIOHandler == null){
            mMemoryIOHandler = createIOHandler(MemoryIOHandler.class);
        }
        return mMemoryIOHandler;
    }

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

    /**
     * 获取 SP 存储
     */
    public IOHandler getPreferencesIOHandler(){
        if(mPreferencesIOHandler == null){
            mPreferencesIOHandler = createIOHandler(PreferencesIOHandler.class);
        }
        return mPreferencesIOHandler;
    }

    /**
     * 获取默认存储 - 默认是 SP存储
     * 搞一个默认存储的原因:
     *      有时候代码写完了,但是网上有很多高效的或者本来就是用别人的,但是某些人出了更好的,这样方便切换这3种存储方式
     */
    public IOHandler getDefaultIOHandler(){
        return getMemoryIOHandler();
    }
}

3>:定义数据存储规范 IOHandler接口如下:

/**
 * Email: [email protected]
 * 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***************/
}

4>:3种存储方式对应的 MemoryIOHandler、PreferenceIOHandler、DiskIOHandler存取数据代码如下,这里就贴 MemoryIOHandler运行内存缓存代码,其余两种和这个是一样的:

/**
 * Email: [email protected]
 * Created by Novate 2018/5/6 19:08
 * Version 1.0
 * Params:
 * Description:    内存缓存
*/

public class MemoryIOHandler implements IOHandler {

    // 存在 运行内存中,LruCache原理其实就是 HashMap集合 ,存储图片或者其他类型都是可以的
    private static LruCache 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;
    }
}

5>:最后直接在MainActivity中测试即可,代码如下:

/**
 * Email: [email protected]
 * 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);
        IOHandler ioHandler = IOHandlerFactory.getInstance().getDefaultIOHandler() ;
        ioHandler.save("userName" , "北京 - Novate");
        ioHandler.save("userAge" , "920925");
    }

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

你可能感兴趣的:(工厂设计模式(四) - 抽象工厂模式)