单例设计模式

目录

        简介

        常用方法

        


简介

单例设计模式是一种创建对象的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点来获取该实例。

在单例设计模式中,类通过以下方式实现只有一个实例:

  1. 私有构造方法(Private Constructor):为了防止类被其他类直接实例化,单例类通常将构造方法声明为私有的,使得其他类无法通过构造方法创建该类的实例。

  2. 静态成员变量(Static Member Variable):单例类内部通常会声明一个私有的静态成员变量,用于存储单例对象的实例。

  3. 静态获取方法(Static Get Method):单例类会提供一个公共的静态方法,允许其他类通过该方法获取单例对象的实例。该方法会先判断静态成员变量是否已经被实例化,如果是,则直接返回该实例;如果否,则创建一个新的实例并赋值给静态成员变量,然后返回该实例。

通过以上的方式,单例设计模式保证了一个类只有一个实例,并提供了一个全局访问点来获取该实例。这样可以避免多个实例的创建,节省系统资源,并且在需要共享对象时,提供了一种方便的访问方式。

需要注意的是,单例模式在多线程环境下需要考虑线程安全性,可以通过加锁等方式来保证线程安全性。

总结起来,单例设计模式通过私有构造方法、静态成员变量和静态获取方法,保证一个类只有一个实例,并提供了全局访问点来获取该实例。它可以用于需要共享对象、避免重复创建对象等场景。

常用方法

  1. 饿汉式(Eager Initialization): 在这种方法中,单例实例在类加载时就被创建,因此它是线程安全的。可以通过私有静态成员变量直接实例化单例对象,并提供一个公共的静态获取方法来获取该实例。例如:
    public class Singleton {
        private static final Singleton instance = new Singleton();
    
        private Singleton() {
            // 私有构造方法
        }
    
        public static Singleton getInstance() {
            return instance;
        }
    }

  2. 懒汉式(Lazy Initialization): 在这种方法中,单例实例在首次被使用时才被创建,也称为延迟加载。需要注意的是,懒汉式的实现在多线程环境下可能存在线程安全性问题,需要进行同步处理。以下是一种简单的线程安全的懒汉式实现:
    public class Singleton {
        private static volatile Singleton instance;
    
        private Singleton() {
            // 私有构造方法
        }
    
        public static Singleton getInstance() {
            if (instance == null) {
                synchronized (Singleton.class) {
                    if (instance == null) {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
    

在上述代码中,使用了双重检查锁定(Double-Checked Locking)的方式来保证线程安全性。

        3. 静态内部类(Static Inner Class): 这种方法利用了类加载的特性,通过静态内部类来延迟加载单例实例。静态内部类在首次被使用时才会加载,且加载类的过程是线程安全的。以下是静态内部类实现的示例:

public class Singleton {
    private Singleton() {
        // 私有构造方法
    }

    private static class SingletonHolder {
        private static final Singleton instance = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
}

通过上述三种常用的方法,可以实现单例设计模式并确保在应用程序中只有一个实例被创建。选择适合的方法取决于具体的需求和场景,需要综合考虑线程安全性、延迟加载等因素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值