工厂设计模式定义
定义一个创建对象的接口,让子类决定实例化哪个类,而对象的创建统一交由工厂去生成,既做到了解耦也保证了最少知识原则。一般分为三类:简单工厂模式,工厂方法模式,抽象工厂模式
举例
提供两种存储方式让子类决定采用哪种方式存储。
简单工厂模式:直接在工厂中根据传来的类型动态实例化类 创建对象的接口:
public interface IOHandler {
void save(String key,String value);
void save(String key,int value);
String getString(String key,String defalutValue);
int getInt(String key,String defalutValue);
}
对象实现接口:
public class PreferenceIoHandler implements IOHandler{
@Override
public void save(String key, String value) {
}
@Override
public void save(String key, int value) {
}
@Override
public String getString(String key, String defalutValue) {
return null;
}
@Override
public int getInt(String key, String defalutValue) {
return 0;
}
}
public class MemoyIOhander implements IOHandler {
//存在内存里面,其实就是一个Map集合
private static LruCache<String,Object> mCache= new LruCache<>(1024*1024);
@Override
public void save(String key, String value) {
}
@Override
public void save(String key, int value) {
}
@Override
public String getString(String key, String defalutValue) {
return null;
}
@Override
public int getInt(String key, String defalutValue) {
return 0;
}
}
对象的创建统一交给工厂去完成
public class IOFactory implements Factory{
// 通过 Factory 去创建 IOHandler 对象
public static IOHandler createIOHandler(IOType type){
switch (type){
case IOType.MEMORY:
// 内存缓存
return new MemoryIOHandler();
case IOType.PREFERENCES:
// Preferences缓存
return new PreferencesIOHandler();
case IOType.DISK:
// 磁盘缓存
return new DiskIOHandler();
default:
return null;
}
}
}
客户端决定去实现哪个类:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取磁盘缓存的 IOHandler
IOHandler ioHandler = IOFactory.createIOHandler(IOFactory.IOType.DISK);
// 保存数据
ioHandler.save("userName","darren");
ioHandler.save("userPwd","940223");
}
**工厂方法:一个工厂类实现一种存储方式的实列类** 一个工厂一般生产相对应的产品 创建对象的接口: ``` public interface IOHandler {
void save(String key,String value);
void save(String key,int value);
String getString(String key,String defalutValue);
int getInt(String key,String defalutValue);
}
对象实现接口:
public class PreferenceIoHandler implements IOHandler{ @Override public void save(String key, String value) {
}
@Override
public void save(String key, int value) {
}
@Override
public String getString(String key, String defalutValue) {
return null;
}
@Override
public int getInt(String key, String defalutValue) {
return 0;
}
}
public class MemoyIOhander implements IOHandler {
//存在内存里面,其实就是一个Map集合
private static LruCache<String,Object> mCache= new LruCache<>(1024*1024);
@Override
public void save(String key, String value) {
}
@Override
public void save(String key, int value) {
}
@Override
public String getString(String key, String defalutValue) {
return null;
}
@Override
public int getInt(String key, String defalutValue) {
return 0;
}
}
对象的创建统一交给工厂去完成
public interface IOFactory {
IOHandler createIOhandler();
}
public class MemoryIOFactory implements IOFactory { @Override public IOHandler createIOhandler() { return new MemoyIOhander(); } }
public class PerferenceIOFactory implements IOFactory { @Override public IOHandler createIOhandler() { return new PreferenceIoHandler(); } }
客户端决定去实现哪个类:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取磁盘缓存的 IOHandler IOFactory ioFactory = new MemoryIOFactory(); IOHandler ioHandler= ioFactory.createIOhandler();
// 保存数据
ioHandler.save("userName","darren");
ioHandler.save("userPwd","940223");
}
}
<br/>
**抽象工厂:在一个工厂中,实现不同的方法实列化不同的对象**
定义跟 BItmapFactory 比较像,也跟简单工厂模式比较像,通过特定的方法返回单一的对象
创建对象的接口:
public interface IOHandler {
void save(String key,String value);
void save(String key,int value);
String getString(String key,String defalutValue);
int getInt(String key,String defalutValue);
}
对象实现接口:
public class PreferenceIoHandler implements IOHandler{ @Override public void save(String key, String value) {
}
@Override
public void save(String key, int value) {
}
@Override
public String getString(String key, String defalutValue) {
return null;
}
@Override
public int getInt(String key, String defalutValue) {
return 0;
}
}
public class MemoyIOhander implements IOHandler {
//存在内存里面,其实就是一个Map集合
private static LruCache<String,Object> mCache= new LruCache<>(1024*1024);
@Override
public void save(String key, String value) {
}
@Override
public void save(String key, int value) {
}
@Override
public String getString(String key, String defalutValue) {
return null;
}
@Override
public int getInt(String key, String defalutValue) {
return 0;
}
}
对象的创建统一交给工厂去完成
public class IOHandlerFactory {
public static IOHandler createIohandler(Class<? extends IOHandler> IiohanflerClass){
IOHandler ioHandler = null;
try {
ioHandler= IiohanflerClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return ioHandler;
}
public static IOHandler getMemoryIOHandler(){
return createIohandler(MemoyIOhander.class);
}
public static IOHandler getPreferenceIOHandler(){
return createIohandler(PreferenceIoHandler.class);
}
}
客户端决定去实现哪个类:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取磁盘缓存的 IOHandler IOHandler ioHandler = IOHandlerFactory.getMemoryIOHandler();
// 保存数据
ioHandler.save("userName","darren");
ioHandler.save("userPwd","940223");
}
}
#### 使用场景:
使用的对象有共性,并且在以后存在多样性。并且我们的创建的对象的过程不想让别人知道并比较复杂。数据库创建(Factory),地图的选择(百度,高德,google),加载图片类型的选择(ImageLoader,Glide,Picasso),源码(BitmapFactory,XmlPullParserFactory)