设计模式学习之--Singleton(单例)模式

来源:互联网 发布:ybi 源码 编辑:程序博客网 时间:2024/05/06 12:12
 

1、Singleton单例模式,是一种责任型模式。这种模式,通过隐藏构造器和提供对创建对象的单个访问点,实现了将类的职责---创建一个担当着独一无二角色的对象(生产唯一实例),集中于类的单个实例中。

2、它的宗旨:确保某个类只有一个实例,并且为之提供一个全局访问点。

3、它的机制:将该单例对象作为单例类的一个静态域创建实例;显示提供唯一的私有构造器(注意,必须显示提供,否则使用者仍然会调用系统提供的默认构造器来实例对象);提供一个具有公有访问属性的静态方法,利用它获取该类的唯一实例。

4、初始化实例的两种时机:

   提前创建单例对象----申明该单例对象的静态域时创建实例;

   滞后初始化----------在第一次使用该单例对象的时候再创建实例。滞后实例化单例对象的两个理由:也许在静态初始化时间,你没有关于如何初始化单例对象的足够信息;也许为了等待资源,诸如数据库连接,尤其是在某些特定会话中不需要这个单例的应用程序中。

5、多线程环境中确保创建唯一实例:使用属于当前类的锁进行同步,即使用锁机制来协调不同线程中多个方法的运行。因为我们无法保证,在多线程环境中,一个方法能够持续运行到结束,其它线程的方法才开始运行。此外,我们也应该在多线程环境中,应用这个同步机制,来限制对单例对象内部数据的访问。

6、该模式或许是最负盛名的模式,但由于我们很容易误用它,因此不要轻易使用。不要让Singleton模式成为创建全局变量的唯一方式。注意,如果是想创建供测试用的子类,它可能不是最合适的,因为并不只有一个实例。

7、示例:

public class Singleton{

    private static Singleton instance;

    privage static Object classLock = Singleton.class;

    private int count;

    private Singleton(){

         count = 0;

    }

    public static Singleton getInstance(){

         synchronized(classLock){

              if(instance == null){

                   instance = new Singleton();

              }

              return instance;

         }

    }

    public void recordCount(){

         synchronized(classLock){

             count++;

         }//注意:此处也需要做同步,我们无法保证,不会有两个以上线程同时操作此count属性。

    }

}