前言
工厂设计模式系列文章
工厂设计模式(一)- 简介
工厂设计模式(二) - 简单工厂模式
工厂设计模式(三) - 工厂方法模式
工厂设计模式(四) - 抽象工厂模式
工厂设计模式(五) - 使用场景
1. 工厂方法模式定义?
一个工厂只生成它相对应的产品,也就是说每一个产品都有一个工厂, 针对于示例代码意思就是:
一个IOFactory 对应一个 IOHandler
- 运行内存缓存MemoryIOHandler,对应一个MemoryIOFactory工厂;
- 本地SP缓存PreferenceIOHandler,对应一个PreferenceIOFactory工厂;
- 磁盘缓存DiskIOHandler,对应一个DiskIOFactory工厂;
2. 工厂方法模型UML关系图如下
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:解决了上一节所讲的如果新增加存储方式的话,就去修改原来的代码,这里可以直接新增类就行;
工厂方法模式缺点:
每新增一种缓存方式,类会不断增加,而且逻辑基本一样,在一定程度上,代码冗余;
那么我会在下一节讲解抽象工厂模式来解决这个问题;