【设计模式】 单例模式的几种写法

来源:互联网 发布:js在字符串中查找字符 编辑:程序博客网 时间:2024/06/05 09:59
          单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。

    其实,GoF对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。

    在应用系统开发中,我们常常有以下需求:

        -在多个线程之间,共享同一个资源或者操作同一个对象

        -在整个程序空间使用全局变量,共享资源

        -大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。

    因为Singleton模式可以保证为一个类只生成唯一的实例对象,所以这些情况,Singleton模式就派上用场了。


   首先是我们熟悉的饿汉式和懒汉式的写法

    

//饿汉式public class Person {//在类初始化的时候就完成了对象的实例化。public static final Person person = new Person();private String name;//省略get/set方法//构造函数私有化private Person() {}//提供一个全局的静态方法public static Person getPerson() {return person;}}
//懒汉式public class Person {private String name;private static Person person;//构造函数私有化private Person() {}//提供一个全局的静态方法public static Person getPerson() {//在使用该对象的时候如果不存在则进行创建if(person == null) {person = new Person();}return person;}

    在使用懒汉式的单例方法时,如果我们的程序是多线程的,可能会出现第一个线程判断不存在,则创建,在创建过程中,第二个线程来方法也判断不存在,同样创建。这样就会存在两个实例,所以将该方法设置为同步方法,看下面的代码.

         

public synchronized static Person getPerson() {//在使用该对象的时候如果不存在则进行创建        if(person == null) {     person = new Person();}return person;}

      细心的你一定会看到其实只是加入了synchronized来保证方法的同步.

      其实在执行这个方法的时候,更多的时候我们是在判断对象是否存在,而不是在创建对象.将判断对象是否存在也放到同步方法中,势必会导致效率降低.所以我们只对实例化方法进行同步.

     

public static Person getPerson() {if(person == null) {synchronized(Person.class){   person = new Person();}}return person;}


      创建方法只能被执行一次,而判断是否存在实例是要经常执行,如果把同步操作包含判断则效率会很慢。
      如果我们还想要提高效率,可以试一试双重检查.看代码.
public static Person getPerson() {if(person == null) {synchronized (Person.class) {if(person == null) {person = new Person();}}}return person;}
      

       以上就是单例模式的几种写法.