你也来学设计模式 之简单工厂模式 Factory

来源:互联网 发布:vb中boolean 编辑:程序博客网 时间:2024/06/16 21:16
1.什么是工厂模式
在应用程序设计中,工厂模式是最为普遍的应用模式之一。即使我们第一次听过这种设计模式,但是只要读者懂得一些程序设计语法知识,不知不觉自己会应用到这个模式思想去设计自己的程序。举个很典型的应用场景:加入有一个车制造工厂,这个工厂能够提供A车系列、B车系列以及C车系列,每个系列的车统一都由引擎、车轮、车身等相同的元素组成。如果我们在程序设计中在创建者三种系列的车身每次申请对象的时候都独立开来,无疑会增加更多的累赘代码。因此,工厂模式的优势就突显而来了!我们只需要一条生产线足以!


2.该模式适应范围

(1)对象内部结构差异不大,存在复杂又多的属性时

(2)对象构造过程差异不大时,能直接通过静态方法引用出来的时候


3.具体应用

笔者这里也直接使用简单的案例--数据存储

在android数据吃就好存储中,有很多种方法可以实现,例如Shared Preferences、Internal Storage、External Storage、SQLite Databases等。这里数操作无非也是增删改查四种操作,所以这里对于不同存储方式中,我们可以直接通过工厂模式提供,具体应用如下:

(1)存储抽象类SaveHandler

 
/**
* 存储抽象类 增 删 改 查
* Created by wsy on 2016/2/18.
*/
public abstract class SaveHandler {
 
/**
* insert id and name to memory,return to insert the results.
* @param id
* @param name
* @return
*/
public abstract boolean add(String id,String name);
 
/**
* remove record
* @param id
* @return
*/
public abstract boolean delete(String id);
 
/**
* update record
* @param id
* @return
*/
public abstract boolean update(String id);
 
/**
* search person name from id
* @param id
* @return
*/
public abstract String query(String id);
 
}
(2)三种存储类(文件 sp sqlite)
 
import android.util.Log;
 
/**
* 文件存储拿
* Created by wsy on 2016/2/18.
*/
public class FileHandler extends SaveHandler{
 
private final String TAG = "FileHandler";
 
@Override
public boolean add(String id, String name) {
Log.i(TAG,"文件存储 添加一条新纪录");
return false;
}
 
@Override
public boolean delete(String id) {
Log.i(TAG,"文件存储 删除一条新纪录");
return false;
}
 
@Override
public boolean update(String id) {
Log.i(TAG,"文件存储 更新一条新纪录");
return false;
}
 
@Override
public String query(String id) {
Log.i(TAG,"文件存储 查询一条新纪录");
return null;
}
}
 
import android.util.Log;
 
/**
* 从sp拿数据
* Created by wsy on 2016/2/18.
*/
public class SpHandler extends SaveHandler{
 
private final String TAG = "SpHandler";
 
@Override
public boolean add(String id, String name) {
Log.i(TAG, "SP存储 添加一条新纪录");
return false;
}
 
@Override
public boolean delete(String id) {
Log.i(TAG,"SP存储 删除一条新纪录");
return false;
}
 
@Override
public boolean update(String id) {
Log.i(TAG,"SP存储 更新一条新纪录");
return false;
}
 
@Override
public String query(String id) {
Log.i(TAG,"SP存储 查询一条新纪录");
return null;
}
}
 
import android.util.Log;
 
/**
* 从数据库
* Created by wsy on 2016/2/18.
*/
public class SQLiteHandler extends SaveHandler {
 
private final String TAG = "SQLiteHandler";
 
@Override
public boolean add(String id, String name) {
Log.i(TAG, "数据库存储 添加一条新纪录");
return false;
}
 
@Override
public boolean delete(String id) {
Log.i(TAG,"数据库存储 删除一条新纪录");
return false;
}
 
@Override
public boolean update(String id) {
Log.i(TAG,"数据库存储 更新一条新纪录");
return false;
}
 
@Override
public String query(String id) {
Log.i(TAG,"数据库存储 查询一条新纪录");
return null;
}
}
(4)工厂类提供存储方式,采用抽象类形式
 
/**
* 数据存储 工厂提供者
* Created by wsy on 2016/2/18.
*/
public class SaveFactory {
 
public static <T extends SaveHandler>T getSaveHandler(Class<T> tClass){
SaveHandler saveHandler = null;
try {
saveHandler = (SaveHandler)Class.forName(tClass.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return (T) saveHandler;
}
 
}
(5)测试方法
public void factorySimpleTest(){
// SaveHandler factory = SaveFactory.getSaveHandler(SQLiteHandler.class);
// factory.query("123");
SaveHandler factory = SaveFactory.getSaveHandler(SpHandler.class);
factory.delete("123");
}
这里可以直接通过getSaveHandler()方法,通过类名直接获取到不同的存储对象,从而进行不同的存储操作

总结:
工厂模式对于结构差异性不大的类提供了实例化快速具有明显的优势,但是每次工厂方法添加新产品的时候要添加新产品类,并且引入抽象层的时候会倒是类的结构复杂化,所以使用还是同个开发者进行衡量。


傻小孩b
20150218

1 0
原创粉丝点击