首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计形式-单例

2012-10-12 
设计模式-单例package com.tag2public class 单例模式 {/** * 应用场景: *1. 系统访问人数 *2. 系统内部

设计模式-单例
package com.tag2;
public class 单例模式 {

/**
* 应用场景:
*        1. 系统访问人数
*        2. 系统内部事件
*        3. 系统操作日志
*        4. 系统出错日志
*        5. 系统配置访问接口
*        ...
*        [单例主要应用于一个类只有一个实例]
* 单例模式发展.
*     *. 经典的单例模式


     * 同步方法可以解决线程安全问题,但是同步方法开销会增大,为了整体系统的效率,尽量不要使用同步.
     *
 *  private final Object startupShutdownMonitor = new Object();
*  在对象中声名一个最终对象进行锁定,这样Application一次就只能有一个方法进入.
*  Struts如何实现单例:
  
*  点评:actions是一个HashMap实例,这里使用同步代码块的方法synchronized(actions)[注意:同步代码块比同步方法开销小]
*  当一个请求过来时[线程],这里使用了同步,每一次都从actions中得到对象.如果不为空,则返回,如果为空则通过反映生成对象并返回.
*  这其实也属于单例注册.
*  上面介绍了Spring对应多个配置文件时用的同步,Struts的核心Action的同步,下面介绍一个Spring的核心Bean是如何实现单例的.

*  Return the (raw) singleton object registered under the given name,
*  creating and registering a new one if none registered yet.
  
* 细心的读者会发现,Struts和Spring都是采用单例注册器的方式实现的.
* private final Map singletonObjects = CollectionFactory.createConcurrentMapIfPossible(16);
* 这里根据你的jdk版本判断使用哪种同步Map
* if  JDKVersion>JAVA_15[或者包括edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap]
*                               new ConcurrentHashMap(initialCapacity)
*                          else
*                               Collections.synchronizedMap(new HashMap(initialCapacity));
* 如果单例注册器中没有此对象
 *                  1. beforeSingletonCreation(beanName); //监视创建对象前 *                  2. singletonObject = singletonFactory.getObject();//返回对象 *singletonFactory.getObject();这是接口方法,这个接口由程序在调用的时候实现. *getSingleton(beanName, new ObjectFactory() {public Object getObject() throws BeansException {try {return createBean(beanName, mbd, args);//创建方法就是在子类要重写的}catch (BeansException ex) {// Explicitly remove instance from singleton cache: It might have been put there// eagerly by the creation process, to allow for circular reference resolution.// Also remove any beans that received a temporary reference to the bean.destroySingleton(beanName);throw ex;}}  }); *                 3.afterSingletonCreation(beanName);//监视创建对象后 *                 4.addSingleton(beanName, singletonObject);//添加对象到singletonObjects *                 5.返回该对象. * 综上所述:在应用于系统资源时,为了提供同一接口,需要同步信息,但是Struts和Spring都使用了代码块同步,我们写程序的时候也要向 * 那些大师学习,尽量同步代码块. *   */ }


热点排行