单件模式
单件模式
单件模式的结构非常简单,只包括一种角色:单件类(Singleton),单件类只可以创建出一个实例。
单件类在设计上有如下特点:
1.单件类中包含自身声明的类变量,这个类变量是单件类唯一的实例。
2.单件类的构造方法是private。为了确保单件类中自身声明的类变量是单件类的唯一实例,单件类必须将构造方法的访问权限设置为private。这样,任何其他的类都无法使用单件类来创建对象。
3.单件类负责创建自己唯一的实例,并提供访问该实例的类方法。由于单件类的构造方法被设置为private,所以单件类必须自己负责创建自身声明的实例。为了让用户使用单件类的这个唯一的实例,单件类必须提供一个类方法,以便其他用户使用单件类的类名就可以调用这个类方法访问使用单件类的这个唯一实例。
在Java中,可以使用以下两种方法设计单件类。
一、在JVM加载单件类时创建它的唯一实例
对于单件类中声明的类变量,即该单件类的唯一实例,在单件类被JVM加载到内存时就会被分配空间,该内存空间用于存放实例的引用,因此,可以在声明该类变量的同时就初始化它,即创建该实例。下面是Java实现单件类的代码:
1 public class Singleton{
2 //JVM加载Singleton时创建uniqueInstance
3 private static Singleton uniqueInstance=new Singleton();
4 private Singleton(){}//构造方法是private权限
5 public static Singleton getInstance(){
6 return uniqueInstance;
7 }
8 }
2.在单件类提供的类方法中创建这个唯一的实例
对于单件类中声明的类变量,当单件类被JVM加载到内存时就会被分配空间,该内存空间用于存放单件类的实例的引用,但是如果我们不去创建单件类的这个实例,那么该类变量中的值就是null,表明该实例还没有被创建。如果程序希望用户需要时再创建单件类的唯一实例,即用户需要调用单件类提供的方法时再创建它,那么为了防止多线程在调用这个类方法时创建多个单件类的实例,可以将类方法设置为同步方法。下面是Java实现单件类的代码
1 public class Singleton{ 2 private static Singleton uniqueInstance;//唯一的对象 3 private Singleton(){}//构造方法是private权限 4 public static synchronized Singleton getInstance(){//同步的方法 5 if(uniqueInstance==null){ 6 uniqueInstance=new Singleton(); 7 } 8 return uniqueInstance; 9 } 10 }