单例模式

175 阅读1分钟

目的

确保类只有唯一实例。

实现

public class SingletonPattern {
    private static SingletonPattern singletonPattern = null;
    public static SingletonPattern getInstance(){
        if(singletonPattern == null){
            return new SingletonPattern();
        }
        return singletonPattern;
    }
    private SingletonPattern() {
    }
    //  方法
    public void display(){
        System.out.println("我是单例模式");
    }
}

注意点

(1)构造函数的可见性应为private,从而禁止外部类通过new创建对象。

(2)通过声明静态私有变量保存该类的唯一实例。

(3)通过静态方法getInstance创建该类的唯一实例。

饿汉式单例

public class EagerSingleton {
    private static final EagerSingleton instance = new EagerSingleton();
    private EagerSingleton() {
    }
    public static EagerSingleton getInstance(){
        return instance;
    }
}

特点:在类加载时就创建了单例对象。

懒汉式单例

给出了双重检查锁定实现的懒汉式单例类:

public class LazySingleton {
    private volatile static LazySingleton lazySingleton = null;
    private LazySingleton() {
    }
    public static LazySingleton getInstance(){
        //  第一重判断
        if(lazySingleton == null){
            //  锁定代码块
            synchronized (LazySingleton.class){
                //  第二重判断
                if(lazySingleton == null){
                    lazySingleton = new LazySingleton();
                }
            }
        }
        return lazySingleton;
    }
}

在第一次调用getInstance()方法时实例化,在类加载时并不自 行实例化(延迟加载)。

饿汉式单例类与懒汉式单例类比较

名称 饿汉式 懒汉式
优点 无须考虑多线程访问问题,调用速度和反应时间更优 无须一直占用系统资源

更好的单例模式(IoDH)

要点:在单例类中增加一个静态内部类,在这个内部类中创建该单例类的唯一实例。

public class Singleton {
    private Singleton() {
    }
    private static class HolderClass{
        private final static Singleton singleton = new Singleton();
    }
    public static Singleton getInstacne(){
        return HolderClass.singleton;
    }

    public static void main(String[] args) {
        Singleton s1,s2;
        s1=Singleton.getInstacne();
        s2=Singleton.getInstacne();
        System.out.println(s1 == s2);
    }
}

由于静态单例对象没有作为成员变量,使得类加载时并不会实例化,而是在调用getInstacne方法时才实现第一次实例化

该方式实现的单例模式即实现了延迟加载,又保证了线程安全。