`
cocogg
  • 浏览: 16067 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

单例模式(Singleton )

阅读更多
特点:
  只产生一个实例 。

如何实现:
  首先我们来看怎么生成一个实例。
 
Singleton singleton = new Singleton ();

  如何防止此类事情发生呢?
  对,私有构造方法,避免外部创建实例。
 
private Singleton (){ }

  你不让我生成新的实例,我怎么用啊,所以必须提供一个方法来返回这个唯一的实例。
 
private static final Singleton m_instance = new Singleton ();
  public static Singleton getInstance() {
         return m_instance;
     }


好了,到此结束了。

当然如果继续深入研究还有以下内容:

懒汉式
  懒汉式,就是先不初始化,等需要的时候再初始化。

public class LazySingleton {
     /**
      * 私有静态对象,加载时候不做初始化
      */
     private static LazySingleton m_intance=null;
     /**
      * 私有构造方法,避免外部创建实例
      */
     private LazySingleton(){
     }
     /**
      * 静态工厂方法,返回此类的唯一实例.  
      * 当发现实例没有初始化的时候,才初始化.
      */
     synchronized public static LazySingleton getInstance(){
         if(m_intance==null){
             m_intance=new LazySingleton();
         }
         return m_intance;
     }
}


为什么用 synchronized ,主要是考虑线程安全。
用我自己的语言表达就是:当两个线程同时执行到
if(m_intance==null)
这个判断时,得到结果都为true,于是都执行了
m_intance=new LazySingleton();

这样就违背了“只产生一个实例”的原则。


饿汉式
就是开始提到的那种方法。

登记式 
克服饿汉式单例类及懒汉式单例类均不可继承的缺点而设计的.
顺便提及:什么情况下不能被继承。
1、class被定义成final的时候。
2、class没有public的构造函数的时候。

import java.util.HashMap;
import java.util.Map;

public class RegSingleton {
     /**
      * 用来存放所有登记的实例
      */
     private static Map<String, RegSingleton> m_registry = new HashMap();
     //在类加载的时候添加一个实例到登记薄
     static {
         RegSingleton x = new RegSingleton();
         m_registry.put(x.getClass().getName(), x);
     }
     /**
      * 受保护的默认构造方法
      */
     protected RegSingleton() {
     }
     /**
      * 静态工厂方法,返回指定登记对象的唯一实例;
      * 对于已登记的直接取出返回,对于还未登记的,先登记,然后取出返回
      * @param name
      * @return RegSingleton
      */
     public static RegSingleton getInstance(String name) {
         if (name == null) {
             name = "RegSingleton";
         }
         if (m_registry.get(name) == null) {
             try {
                 m_registry.put(name, (RegSingleton) Class.forName(name).newInstance());
             } catch (InstantiationException e) {
                 e.printStackTrace();
             } catch (IllegalAccessException e) {
                 e.printStackTrace();
             } catch (ClassNotFoundException e) {
                 e.printStackTrace();
             }
         }
         return m_registry.get(name);
     }
     /**
      * 一个示意性的商业方法
      * @return String
      */
     public String about() {
         return "Hello,I am RegSingleton!";
     }
}


 


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics