黑马程序员技术交流社区
标题:
求一个单例模式的应用例子。
[打印本页]
作者:
Lop_adoule
时间:
2013-8-27 00:44
标题:
求一个单例模式的应用例子。
求一个单例模式的
应用实例
,
最好同时给个 把懒加载以及单例扩展的例子。
先谢谢大家了!
作者:
范龙波
时间:
2013-8-27 00:53
赖汉式:
特点:延时加载 ,双重if判断 ,用到锁是当前类的字节码
主要面试时经学会遇到,我之前在看面试题时,看到过很多次,况且老毕好像也这么说
饿汉式:
我感觉张老的那个"AOP功能的封装与配置"Demo中就可以把BeanFactory 写成单例
作者:
唐升
时间:
2013-8-27 01:27
本帖最后由 唐升 于 2013-8-27 01:29 编辑
java中单例设计模式是应用比较广泛的一种模式。简单说,单例设计模式是为保证类的实例对象的唯一性而存在的一种模式,最常见的就是大家常用的软件的配置文件了,在项目中可能多次使用这个类,如果每次都new一个实例出来,这样在运行期间就会存在很多实例,而实际上只需要一个实例对象就可以了。多出来的实例对象会浪费内存资源.
1.jpg
(70.91 KB, 下载次数: 45)
下载附件
2013-8-27 01:28 上传
C:\Users\Administrator\Desktop:1.jpg
作者:
黑马-文鸿利
时间:
2013-8-27 07:24
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的对象在内存中单例。
这个例子里单例,多例,工厂,都有。也许有的用的还不对,不过没有关系,达到目的就可以。什么是模式,模式是对某类问题的一般解决方法。一个没有看过模式书籍的人一样可以写出很多模式。因为很多人遇到同样的问题的时候选择了同样的解决方案。最后这个方案上升到了一个高度,然后为了区别这个通用方案和一般方案才发明了模式这个词。我们应该为了解决问题使用模式,而不是为了使用模式而制造问题。
作者:
老衲玩IT
时间:
2013-8-28 11:58
用枚举来做单例应用够妙吧?
public enum SingleInstance{
instance;
SingleInstance(){}
SingleInstance(Object field){
this.field=field;
}
private Object field;
public void method(Object value) {
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2