单例模式运用例子

需求:

对存储在数据库中的静态数据进行缓存。在我们进行数据库系统(或者称之为信息管理系统、MIS系统)开发的时候,总是不能避免从数据库中读取数据。然而有一些字典表中的数据相对固定,不经常变化。反复的从数据库中将这些数据的读取出来十分浪费系统资源。希望可以在系统启动的时候能够自动将这些数据加载到系统的内存中。

分析:

数据库表中的数据在内存中的时,要求有且仅有一份。考虑使用单例模式做对象的缓存模型。而且数据库中的这种字典表可能会有很多。如果数据量都比较小,可以考虑都缓存在内存中。考虑使用多例模式。

应用:

import java.util.HashMap;

/**

* @author zhangx

* 缓存对象工厂

*/

public class ObjectCatchFactory {

private ObjectCatchFactory(){

}

private static ObjectCatchFactory factory = new ObjectCatchFactory();

public static ObjectCatchFactory getInstance(){

return factory;

}

private HashMap objectCatchMap = new HashMap();

/**

* 获取对象缓存容器,如果容器不存在,生成一个新的对象缓存容器实例,并放入objectCatchMap中

* @param name

* @return

*/

public ObjectCatch getObjectCatch(String name){

ObjectCatch oc = (ObjectCatch)objectCatchMap.get(name);

if(oc == null){

oc = new ObjectCatch(name);

objectCatchMap.put(name,oc);

}

return oc;

}

/**

* 增加对象缓存容器

* @param oc

*/

public void addObjectCatch(ObjectCatch oc){

objectCatchMap.put(oc.getCatchName(),oc);

}

/**

*清除所有对象缓存容器

*/

public void clear(){

objectCatchMap.clear();

}

/**

* 移走指定的对象缓存容器

* @param oc

*/

public void remove(ObjectCatch oc){

objectCatchMap.remove(oc.getCatchName());

}

}

package portal.calis.resnvgt;

import java.util.List;

import java.util.Vector;

/**

*

* @author zhangxu

* 对象缓存容器

*/

public final class ObjectCatch{

//容器名称

private final String name;

//存储对象的map

private Vector conter = new Vector();

//是否使用缓存

private boolean enable = true;

protected  ObjectCatch(String name){

this.name = name;

}

/**

* 获取容器名称

* @return

*/

public String getCatchName(){

return this.name;

}

/**

* 容器中增加对象

* @param name

* @param obj

*/

public void add(Object obj){

conter.add(obj);

}

/**

* 返回所有的缓存对象

* @return

*/

public List getAll(){

return conter;

}

/**

* 移走指定名称的缓存对象

* @param name

*/

public void remove(Object obj){

conter.remove(obj);

}

/**

*  清楚缓存对象

*

*/

public void clear(){

conter.clear();

}

/**

* 缓存对象数量

* @return

*/

public int size(){

return conter.size();

}

public boolean isEnable() {

return enable;

}

public void setEnable(boolean enable) {

this.enable = enable;

}

}

总结:

具体的应用中,遇到这样的问题。缓存数据在取出后以列表形式显示时,显示顺序与数据库中存储数据不一样。如果换成Vector来存储数据,虽然数据的排列格式可以和表中数据一样,但是如果根据对象的ID查询就要遍历所有数据。后来发现LinkedMap同时具有两种特点,可以采用。

多例模式的书写方式已经忘记了,只有每个应用的模块都从ObjectCatchFactory中获取才能保证每个名称的ObjectCatch的对象在内存中单例。

     这个例子里单例,多例,工厂,都有。也许有的用的还不对,不过没有关系,达到目的就可以。什么是模式,模式是对某类问题的一般解决方法。一个没有看过模式书籍的人一样可以写出很多模式。因为很多人遇到同样的问题的时候选择了同样的解决方案。最后这个方案上升到了一个高度,然后为了区别这个通用方案和一般方案才发明了模式这个词。我们应该为了解决问题使用模式,而不是为了使用模式而制造问题。

你可能感兴趣的:(单例模式运用例子)