饿汉式、懒汉式以及内部类实现单例

单例模式

  • 写在前面

本篇内容只是简单介绍懒汉式和饿汉式,由于我知识掌握有限,关于线程安全问题以及他们的改进,在后续学习中,我会更新,仅供参考。
在CSDN看到一篇关于他们的改进:

https://blog.csdn.net/u011595939/article/details/79972371

  • 单例:一个类只有一个实例

1.1 饿汉式

" 管你用不用,类加载的时候就把对象造好 "

实现想法:

类里只有一个实例,实例是通过构造器创建的,

1、构造器私有

不能在类的外部通过new 构造器实例化

2、在类中产生唯一对象

封装成 static

3、返回这个唯一对象

静态方法

实现

public class HungryMode {

    // 唯一实例
	private static final HungryMode hungry = new HungryMode();

	// 构造器私有
	private HungryMode(){}

	// 返回唯一对象
    public static HungryMode getInstance(){
        return hungry;
    }  
    
}
  • 不管以后会不会使用到该实例化对象,先造出来再说,比较着急!!!所以
    • 饿汉式实现的办法就是直接 new实例化

1.2 懒汉式

方法调用时再创建

  • 确保使用的是同一个对象
  • “ 我在,只要你需要,我就出现 ”

实现

public class LazyMode {
    
    // 自身实例化对象设置成属性
    private static LazyMode lazyMode;
    
    // 构造器私有
    private LazyMode(){}
    
    // 方法调用时,实例对象
    public static LazyMode getInstance(){
         if (lazyMode == null) { // 它没有饿汉安全,有一些特殊情况会出现多例 (线程问题!!!)
            lazyMode = new LazyMode();
        }
        return lazyMode;
    }    
}

1.3 内部类实现单例

懒汉式的一种,这种懒汉式没有线程问题

  • 结合了饿汉式和懒汉式的优点:

只要不调用getInstance 方法,就不会使用内部类;内部类一旦被使用一次,就只会被初始化一次,以后一直用的是INSTANCE静态常量

实现

public class InnerMode {
    
     // 私有化构造器
     private InnerMode(){}
    
    /**
     * 一个私有的静态内部类,用于初始化一个静态final实例
     */
     private static class SingletonHolder{
        private  static final InnerMode INSTANCE = new InnerMode();  // 外部对象
        // 静态常量一直存在,不会被回收,稍微有点耗资源
    }
    
        public static InnerMode getInstance(){  // 这个方法不调用,就不给下面的对象
        return SingletonHolder.INSTANCE;
    }
    
}
posted @ 2022-07-30 14:31  来日可追  阅读(81)  评论(1编辑  收藏  举报