1. 模式定义
定义一个创建对象的接口,让子类决定实例化哪个类,而对象的创建统一交由工厂去生成,有良好的封装性,既做到了解耦也保证了最少知识原则。工厂就是用来生成对象的,把对象的实例化和初始化封装起来。
下面以数据存储为例介绍工厂设计模式的用法。
2. 简单工厂模式
定义数据操作接口(产品接口)
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);
/*************save data end***************/
/*************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***************/
}
具体数据操作的方式(产品)
public class PreferencesIOHandler implements IOHandler{
...
}
public class MemoryIOHandler implements IOHandler{
...
}
public class DiskIOHandler implements IOHandler{
...
}
工厂类生成数据的具体操作方式类(工厂来组装产品)
public class IOHandlerFactory {
public enum IOType{
MEMORY,PREFERENCES,DISK
}
public static IOHandler createIOHandler(IOType ioType){
switch (ioType){
case MEMORY:
return new MemoryIOHandler();
case PREFERENCES:
return new PreferencesIOHandler();
case DISK:
return new DiskIOHandler();
default:
return null;
}
}
}
思考:比如我新增一个新的方式存储,要怎么改?需要新增类型,需要添加 case。这需要改动原来的很多代码
3. 工厂方法模式
一个具体操作的实现对应一个工厂的方法来生成
工厂方法
public interface IOFactory {
IOHandler createIOHandler();
}
每种操作实现的方式都用一个工厂来生成,一个 IOFactory -> 一个 IOHandler(一个工厂一般生产相对应的产品,)
public class PreferencesIOFactory implements IOFactory{
@Override
public IOHandler createIOHandler() {
return new PreferencesIOHandler();
}
}
public class MemoryIOFactory implements IOFactory{
@Override
public IOHandler createIOHandler() {
return new MemoryIOHandler();
}
}
public class DiskIOFactory implements IOFactory{
@Override
public IOHandler createIOHandler() {
return new DiskIOHandler();
}
}
思考:随着功能的扩展,我们的 IOFactory 类会不断的增加,而且逻辑基本一样,在一定程度代码冗余度高
4. 抽象工厂模式
通过特定的方法返回单一的对象,可利用泛型
public class IOHandlerFactory {
/**
* 利用泛型生成产品
*/
public static IOHandler createIOHandler(Class<? extends IOHandler> ioHandlerClass){
try {
return ioHandlerClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return new PreferencesIOHandler();
}
/**
* 获取 运行内存 存储
* @return
*/
public static IOHandler getMemoryIOHandler(){
return createIOHandler(MemoryIOHandler.class);
}
/**
* 获取 磁盘 存储
* @return
*/
public static IOHandler getDiskIOHandler(){
return createIOHandler(DiskIOHandler.class);
}
/**
* 获取 SP 存储
* @return
*/
public static IOHandler getPreferencesIOHandler(){
return createIOHandler(PreferencesIOHandler.class);
}
/**
* 获取 默认 存储
* @return
*/
public static IOHandler getDefaultIOHandler(){
return getPreferencesIOHandler();
}
}
网友评论