1、Singleton单例模式,是一种责任型模式。这种模式,通过隐藏构造器和提供对创建对象的单个访问点,实现了将类的职责---创建一个担当着独一无二角色的对象(生产唯一实例),集中于类的单个实例中。
2、它的宗旨:确保某个类只有一个实例,并且为之提供一个全局访问点。
3、它的机制:将该单例对象作为单例类的一个静态域创建实例;显示提供唯一的私有构造器(注意,必须显示提供,否则使用者仍然会调用系统提供的默认构造器来实例对象);提供一个具有公有访问属性的静态方法,利用它获取该类的唯一实例。
4、初始化实例的两种时机:
<wbr><wbr><wbr>提前创建单例对象----申明该单例对象的静态域时创建实例;</wbr></wbr></wbr>
<wbr><wbr> 滞后初始化----------在第一次使用该单例对象的时候再创建实例。滞后实例化单例对象的两个理由:也许在静态初始化时间,你没有关于如何初始化单例对象的足够信息;也许为了等待资源,诸如数据库连接,尤其是在某些特定会话中不需要这个单例的应用程序中。</wbr></wbr>
5、多线程环境中确保创建唯一实例:使用属于当前类的锁进行同步,即使用锁机制来协调不同线程中多个方法的运行。因为我们无法保证,在多线程环境中,一个方法能够持续运行到结束,其它线程的方法才开始运行。此外,我们也应该在多线程环境中,应用这个同步机制,来限制对单例对象内部数据的访问。
6、该模式或许是最负盛名的模式,但由于我们很容易误用它,因此不要轻易使用。不要让Singleton模式成为创建全局变量的唯一方式。注意,如果是想创建供测试用的子类,它可能不是最合适的,因为并不只有一个实例。
7、示例:
public class Singleton{
<wbr><wbr><wbr> private static Singleton<wbr>instance;</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr> privage static Object classLock = Singleton.class;</wbr></wbr></wbr>
<wbr><wbr><wbr> private int count;</wbr></wbr></wbr>
<wbr><wbr><wbr> private Singleton(){</wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> count = 0;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr> }</wbr></wbr></wbr>
<wbr><wbr><wbr> public static Singleton getInstance(){</wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> synchronized(classLock){</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if(instance == null){</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> instance = new Singleton();</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> return instance;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr> }</wbr></wbr></wbr>
<wbr><wbr><wbr> public void recordCount(){</wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> synchronized(classLock){</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> count++;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }//注意:此处也需要做同步,我们无法保证,不会有两个以上线程同时操作此count属性。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr> }</wbr></wbr></wbr>
}