设计模式之单例模式

单例模式  Singleton

参考:https://www.cnblogs.com/zuoxiaolong/p/pattern2.html    侵权删除

什么是单例模式:保证在程序运行周期,至多有一个该对象。

适用性:对象多次重复实例化的场景

单例模式分类:饿汉式、懒汉式、静态内部类

代码要点:

私有化构造函数:保证外部不能实例化对象

私有静态对象:不公开只能通过公开静态获取对象的方法获取对象、公开静态获取对象的方法是静态所以静态

公开静态获取对象的方法:在没有实例的情况下,对开提供获取对象方法。

基本代码如下:

package EagerSingleton;
/**
 * 饿汉模式:类的初始化阶段就实例化对象,如果未使用到该对象,会造成资源的浪费,不存在线程安全问题。
 *
 */
public class EagerSingleton {
    //上来就实例化对象,如果未使用到该对象,会造成资源的浪费
    private static EagerSingleton instance = new EagerSingleton();
    private EagerSingleton(){}
    public static EagerSingleton getInstance(){
        return instance;
    }
}
package LazySingleton;

/**
 * 懒汉模式
 * 只有当第一次需要使用该类的对象时,才创造类,比较的懒
 * 为了保证在多线程的情况下只能创建一个实例,可以使用双检查锁,单检查锁(下面的代码没有实现)
 * 单检查锁:保证一个实例,但是性能不高,许多线程处于阻塞状态。
 * 双检查锁:由于JVM的reorderu优化的原因,可能其他线程会返回一个null的实例
 */
public class LazySingleton {
    private static LazySingleton instance;
    private LazySingleton() {
    }
    public static LazySingleton getInstance(){

        if(instance==null){
            //instance = new LazySingleton();
            synchronized (LazySingleton.class){
                if(instance==null){
                    instance = new LazySingleton();
                }
            }
        }
        return instance;
    }
}
package InnerSingleton;

/**
 * 静态内部类的方法
 * 静态内部类中保存单例,当客户端调用静态方法getInstance()时,会导致InnerSingleton的初始化,再导致静态成员SingletonHolder的初始化,instance得到实例化。
 * 因此只会在虚拟机装载类的时候初始化一次,并由虚拟机来保证它的线程安全性
 */
public class InnerSingleton {
    private InnerSingleton(){}
    //当客户端调用静态方法getInstance()时,会导致InnerSingleton的初始化,再导致静态成员SingletonHolder的初始化
    private static class SingletonHolder{
        // instance得到实例化。
        private static InnerSingleton instance = new InnerSingleton();
    }

    public static InnerSingleton getInstance(){
        return SingletonHolder.instance;
    }
}
原文地址:https://www.cnblogs.com/youzoulalala/p/11063445.html