A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Lop_adoule 中级黑马   /  2013-8-27 00:44  /  1583 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文




求一个单例模式的应用实例

最好同时给个 把懒加载以及单例扩展的例子。  


先谢谢大家了!

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

4 个回复

倒序浏览
赖汉式:
特点:延时加载 ,双重if判断 ,用到锁是当前类的字节码
主要面试时经学会遇到,我之前在看面试题时,看到过很多次,况且老毕好像也这么说
饿汉式:
我感觉张老的那个"AOP功能的封装与配置"Demo中就可以把BeanFactory 写成单例

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
本帖最后由 唐升 于 2013-8-27 01:29 编辑

java中单例设计模式是应用比较广泛的一种模式。简单说,单例设计模式是为保证类的实例对象的唯一性而存在的一种模式,最常见的就是大家常用的软件的配置文件了,在项目中可能多次使用这个类,如果每次都new一个实例出来,这样在运行期间就会存在很多实例,而实际上只需要一个实例对象就可以了。多出来的实例对象会浪费内存资源.
C:\Users\Administrator\Desktop:1.jpg

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
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的对象在内存中单例。

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

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1 下次记得把代码放进那个框框中....

查看全部评分

回复 使用道具 举报
用枚举来做单例应用够妙吧?
  1. public enum SingleInstance{
  2.         instance;
  3.         SingleInstance(){}
  4.         SingleInstance(Object field){
  5.                 this.field=field;
  6.         }
  7.         private Object field;
  8.         public void method(Object value) {
  9.                
  10.         }
  11. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马