单例模式

161 阅读2分钟
  1. 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例。

    • 单例类只能有一个实例。

    • 单例类必须自己创建自己的唯一实例。

    • 单例类必须给所有其他对象提供这一实例。

  2. 如何实现通过饿汉式实现单例模式

    • 好处:线程安全
    • 坏处:创建类的时候就创建对象,对象加载时间过长,会浪费内存。
    public class test {
        @Test
        public void test1() {
            Chinese ch1 = Chinese.getChinese();// 通过方法获得对象1
            Chinese ch2 = Chinese.getChinese();// 通过方法获得对象2
            // 测试对象地址是否一致
            System.out.println(ch1 == ch2);/* true */
        }
    }
    
    class Chinese {
        // 1.私有化构造器,让外部不能创建对象
        private Chinese() {
    
        }
    
        // 2.内部创建静态私有化的类的唯一对象,后续可以通过静态的类的方法来调用对象。
        private static Chinese chinese = new Chinese();
    
        // 3.提供静态的公共方法来调用对象。类外部可以通过类名直接调用。
        public static Chinese getChinese() {
            return chinese;
        }
    }
    
  3. 如何通过懒汉式是实现单例模式

    • 好处:延迟对象创建。
    • 坏处:目前写法线程不安全。
    public class test {
        @Test
        public void test1() {
            Chinese ch1 = Chinese.getChinese();// 通过方法获得对象1
            Chinese ch2 = Chinese.getChinese();// 通过方法获得对象2
            // 测试对象地址是否一致
            System.out.println(ch1 == ch2);/* true */
        }
    }
    
    class Chinese {
        // 1.私有化构造器,让外部不能创建对象
        private Chinese() {
    
        }
    
        // 2.声明当前私有静态的类的对象,没有初始化
        private static Chinese chinese = null;
    
        // 3.提供静态的公共方法来调用对象。类外部可以通过类名直接调用。
        public static Chinese getChinese() {
            // 如果对象从未调用就重新创建,否则就直接返回对象
            if (chinese == null) {
                chinese = new Chinese();
            }
            return chinese;
        }
    }
    
  4. 个人理解:

    • 大家都要喝水,但是没必要每人家里都打一口井是吧,通常的做法是整个村里打一个井就够了,大家都从这个井里面打水喝。

    常用场景:

    • 封装一些常用的工具类,保证整个应用常用的数据统一。
    • 保存一些共享数据在内存中,其他类随时可以读取。
    • 共享常用且唯一的数据,和静态方法、静态属性有点相似。