工厂方法模式是创建性设计模式之一,一般用于复杂对象的创建
该系列其他文章:
- 安卓设计模式(一)面向对象六大设计原则
- 安卓设计模式(二)单例模式
- 安卓设计模式(三)Builder模式
- 安卓设计模式(四)装饰者模式
- 安卓设计模式(五)代理模式
- 安卓设计模式(六)策略模式
- 安卓设计模式(七)模板方法模式
- 安卓设计模式(八)工厂方法模式
定义: 定义一个用于创建对象的接口(非指interface),让子类决定实例化哪个类
使用场景: 创建复杂对象,且有多种功能相同的对象
实现举例
下面以Androd经常用到的缓存Cache来举例说明:
缓存接口,定义所有缓存必须实现的方法
public interface ICache {
String get(String key);
void put(String key, String value);
void removeCache(String key);
void clearCache();
}
工厂方法根据需求又用几种不同的实现,不过思想是一致的,下面分别说明
1. 简单工厂(静态工厂)
如果我们程序中整体只需要一种缓存即可,不需要多种缓存,如磁盘缓存,所以只需要单一缓存子类及单一工厂即可:
/**
* 磁盘缓存,具体方法实现省略
*/
public class DiskCache implements ICache {
@Override
public String get(String key) {
return null;
}
@Override
public void put(String key, String value) {
}
@Override
public void removeCache(String key) {
}
@Override
public void clearCache() {
}
}
/**
* 简单工厂,只创建一种缓存
*/
public class StaticCacheFactory {
public static ICache create() {//注意这里直接使用static方法
return new DiskCache();
}
}
//使用
ICache iCache = StaticCacheFactory.create();
iCache.get("");
2. 工厂与产品一对一,即每个工厂负责生产一种产品
/**
* 工厂接口,定义所有工厂的必须实现的方法
*/
public interface ICacheFactory {
ICache create();//创建缓存
}
/**
* 磁盘缓存工厂,用于生产磁盘缓存实例
*/
public class DiskFactory implements ICacheFactory {
@Override
public ICache create() {
return new DiskCache();
}
}
/**
* 内存缓存工厂,用于生产内存缓存实例
*/
public class MemoryFactory implements ICacheFactory {
@Override
public ICache create() {
return new MemoryCache();
}
}
//使用:
ICacheFactory factory = new DiskFactory();
//如果需要内存缓存
//ICacheFactory factory = new MemoryFactory();
ICache iCache = factory.create();
iCache.clearCache();
3. 工厂与产品一对多,即每个工厂可以生产多种产品
工厂接口,定义所有工厂的必须实现的方法:
public interface ICacheFactory {
<T extends ICache> T create(Class<T> c);//创建缓存实例
}
具体工厂,可根据需求生产不同的产品:
public class CacheFactory implements ICacheFactory {
@Override
public <T extends ICache> T create(Class<T> c) {
T cache = null;
try {
cache = (T) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return cache;
}
}
使用:
ICacheFactory cacheFactory = new CacheFactory();
ICache diskCache = cacheFactory.create(DiskCache.class);//根据类型创建不同的缓存实例
ICache memoryCache = cacheFactory.create(MemoryCache.class);//根据类型创建不同的缓存实例
diskCache.clearCache();
memoryCache.clearCache();
总结
由以上可以的举例可以看到使用工厂方法创建对象简单明了,如果上面的缓存对象创建时需要设置很多参数,初始化数据等等,那么使用工厂方法模式相对于直接new一个实例有很大优势.工厂方法模式将对象的创建过程封装在工厂中,使得客户端无需再关心实例的创建和初始化过程.
实际开发中第三种使用的比较多,根据需求创建不同实例.
关于作者
- 简 书:uncochen
- github:ChenZhen
- 新浪微博:@Chen丶振
- Email:18620156376@163.com
网友评论