单例(Singleton)模式

简介

单例模式有以下特点:

  • 单例类只能有一个实例
  • 单例类必须自己创建自己的唯一的实例
  • 单例类必须给所有其他对象提供这一实例

单例类的简略图如下:


单例(Singleton)模式_第1张图片

饿汉单例模式-Eager Singleton

  • 类图


    单例(Singleton)模式_第2张图片
  • 实现
    public class EagerSingleton {
        //饿汉式单例类.在类初始化时,已经自行实例化
        private static final EagerSingleton EAGER_SINGLETON = new EagerSingleton();
    
        private EagerSingleton() {
        }
    
        public static EagerSingleton getInstance() {
            return EAGER_SINGLETON;
        }
    }
    
  • 总结
    • 这个类被加载时,静态变量就会被初始化
    • 构造函数私有化(不可继承)

懒汉单例模式

  • 类图


    单例(Singleton)模式_第3张图片
  • 实现
    public class LazySingleton {
        private static LazySingleton lazySingleton=null;
    
        private LazySingleton() {
        }
    
        public static synchronized LazySingleton getInstance() {
            if (lazySingleton==null){
                lazySingleton=new LazySingleton();
            }
            return lazySingleton;
        }
    }
    

饿汉VS懒汉

  • 资源利用率

    • 饿汉模式 差
    • 懒汉模式 好

    饿汉模式在自己被加载时就将自己实例化,而懒汉模式则是需要才实例化

  • 速度和反应时间

    • 饿汉模式 好
    • 懒汉模式 差

    懒汉模式必须处理好多线程同时首次引用此类时的访问限制问题,而实例初始化也有可能非常耗时,这会使多线程同时首次引用此类的概率变的极大

你可能感兴趣的:(单例(Singleton)模式)