java的单例设计模式

     单例设计模式是java的一种设计模式,它是指在设计一个类时,要保证在整个程序运行期间针对该类内存中只存在一个实例对象。

     单例设计模式包括饿汉式和懒汉式两种模式。

     饿汉式:类一加载进内存就创建好了对象;

     饿汉式的代码如下:

package com.sjk.sheng;

/**
 * 单例模式之饿汉式
 * @author sjk
 *
 */
public class Single {
    //将构造函数私有化,不让别的类建立该类对象
    private Single(){}
    //自己建立一个对象
    private static final Single s = new Single();
    //提供一个公共访问方式
    public static Single getInstance() {
        return s;
    }
}

     懒汉式:类加载进内存的时候,对象还没有存在,只有调用了getInstance()方法时,对象才开始创建。

     懒汉式的代码如下:

package com.sjk.sheng;

/**
 * 单例模式之懒汉式
 * @author sjk
 *
 */
public class Single {
    private Single(){} 
    private static Single s;
    public static Single getInstance() {
        if(s==null)
            //如果对象为空就创建一个
            s=new Single();
        return s;
    }
}

     懒汉式是延迟加载,如果多个线程同时操作懒汉式时就有可能出现线程安全问题,解决线程安全问题可以加同步来解决。但是加了同步之后,每一次都要比较锁,效率就变慢了,所以可以加双重判断来提高程序效率。

     如将上述懒汉式的Instance函数改成同步:

package com.sjk.sheng;

/**
 * 单例模式之懒汉式线程安全问题的解决方案
 * 
 * @author sjk
 * 
 */
public class Single {

    // 声明本类的一个私有的成员变量
    private static Single single;

    // 第一步 : 私有化构造方法
    private Single() {

    }

    // 第三步:提供一个公共的方法获取该类的实例对象
    public static Single getInstance() {
        if (single == null) {
            synchronized (single) {
                if (single == null) {
                    single = new Single();
                }
            }
        }
        return single;
    }
}

     以上通过饿汉式和懒汉式实现了单例模式,它具备如下的特点:

     1)类的构造方法使用private修饰,声明为私有,这样就不能在类的外部使用new关键字来创建实例对象了。

     2)在类的内部创建一个该类的实例对象,并使用静态变量s引用该对象,由于变量应该禁止外界直接访问,因此使用private修饰,声明为私有成员。

     3)为了让类的外部能够获得类的实例对象,需要定义一个静态方法getInstance(),用于返回该类的实例s。由于是静态的,外部可以通过“类名.方法名”的方式来访问。

     因此饿汉式的单例模式也可以写成以下形式:

package com.sjk.sheng;

/**
 * 单例模式之饿汉式的另一种形式
 * @author sjk
 * 
 */
public class Single {
    private Single() {}
    public static final Single s = new Single();
}

     在上面代码中,首先将该类的构造方法私有化,防止外界创建该类的实例。在该类的内部创建了该类的实例对象,并使用静态变量s来引用,变量s的前面有三个修饰符,其中,public的作用是允许外部直接访问该变量,static的作用是让外部可以使用“类名.变量名”的方式来访问变量,final的作用是禁止外部对该变量进行修改。由于访问变量s是获得Single类实例对象的唯一途径,因此该类实现了单例。

原文地址:https://www.cnblogs.com/sheng-sjk/p/7622975.html