工厂设计模式(三) - 工厂方法模式

前言

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

1. 工厂方法模式定义?


一个工厂只生成它相对应的产品,也就是说每一个产品都有一个工厂, 针对于示例代码意思就是:

一个IOFactory 对应一个 IOHandler

  • 运行内存缓存MemoryIOHandler,对应一个MemoryIOFactory工厂;
  • 本地SP缓存PreferenceIOHandler,对应一个PreferenceIOFactory工厂;
  • 磁盘缓存DiskIOHandler,对应一个DiskIOFactory工厂;

2. 工厂方法模型UML关系图如下


工厂设计模式(三) - 工厂方法模式_第1张图片
图片.png

3. 示例代码如下


1>:首先定义一个 IOFactory工厂,用于生成所有产品的接口,这里就指的是生成Memory、Disk、Preference这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() ;
}

2>:针对于这3个缓存方式,来创建每一个对应的工厂类和其对应的 XXXIOHandler:

a:针对于Memory,创建其对应的MemoryIOFactory工厂类和它对应的MemoryIOHandler,代码如下:
/**
 * Email: [email protected]
 * Created by Novate 2018/5/12 10:05
 * Version 1.0
 * Params:
 * Description:    运行内存缓存的工厂类
*/

public class MemoryIOFactory implements IOFactory{

    @Override
    public IOHandler createIOHandler() {
        return new 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;
    }
}
b:针对于Preference,创建其对应的PreferenceIOFactory工厂类和它对应的PreferenceIOHandler,代码如下:
/**
 * Email: [email protected]
 * Created by Novate 2018/5/12 10:07
 * Version 1.0
 * Params:
 * Description:    本地SP缓存的工厂类
*/

public class PreferenceIOFactory implements IOFactory {
    @Override
    public IOHandler createIOHandler() {
        return new PreferencesIOHandler();
    }
}
/**
 * Email: [email protected]
 * Created by Novate 2018/5/6 19:20
 * Version 1.0
 * Params:
 * Description:    本地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;
    }
}
c:针对于Disk,创建其对应的MemoryIOFactory工厂类和它对应的DiskIOHandler,代码和上边写法一样;

3>:在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);
        IOFactory ioFactory = new MemoryIOFactory() ;
        IOHandler ioHandler = ioFactory.createIOHandler();
        ioHandler.save("userName" , "北京 - Novate");
        ioHandler.save("userAge" , "920925");
    }

    public void click(View view){

        IOFactory ioFactory = new MemoryIOFactory() ;
        IOHandler ioHandler = ioFactory.createIOHandler();
        String userName = ioHandler.getString("userName") ;
        String userAge = ioHandler.getString("userAge") ;
        mTextView.setText("userName = " + userName + " , userAge = " + userAge) ;
    }
}
以上,就是工厂方法模式的写法

4. 工厂方法模式特点


工厂方法模式优点:

  • a:比如我想新增一个 Disk缓存方式,那么我可以直接新增两个类, 分别是DiskIOFactory和DiskIOHandler就可以;
  • b:解决了上一节所讲的如果新增加存储方式的话,就去修改原来的代码,这里可以直接新增类就行;

工厂方法模式缺点:

每新增一种缓存方式,类会不断增加,而且逻辑基本一样,在一定程度上,代码冗余;

那么我会在下一节讲解抽象工厂模式来解决这个问题;

你可能感兴趣的:(工厂设计模式(三) - 工厂方法模式)