常见设计模式_单例模式

本文探讨了单例模式的核心思想,介绍了饿汉模式(初始化即创建)、饱汉模式(懒汉模式,线程安全版本)以及多线程下的线程锁解决方案。同时分析了单例模式的优缺点,强调了在不同环境下选择合适的实现策略的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思想:

        确保一个类只有一个实例,并为其提供一个全局访问接口

核心:

        保证一个类只有一个实例,且外部可访问,只要保证这个效果,可以被视为单例模式(重点是该模式的思想,而不是实现方式)

 实现方式:

        单线程实现方式:

饿汉模式

开局就创建创建该类对象

public class Singleton
{
    public static Singleton _instance = new Singleton();

    public static Singleton Instance
    {
        get { return _instance; }
    }

    private Singleton() { }
}

使用私有构造防止外部创建该类对象。

公有静态对象Instance可以保证项目在开始运行时就创建该对象的同时外部也可以进行访问

饱汉模式

外部程序访问时,判断是否有该对象,如果没有,再进行创建

public class Singleton
{
    private static Singleton _instance;
    public static Singleton Instance
    {
        get
        {
            if (_instance == null)
                _instance = new Singleton();
            return _instance; 
        }
    }

    private Singleton() { }
}

        多线程实现方式:

多线程饿汉模式实现方式与单线程没有什么区别,所以不做过多赘述

线程锁

        在单线程饱汉模式代码中,外部程序访问Instance时,会判断该对象是否有对象,如果没有再创建对象,这段代码放到多线程时可能会遇到两个线程的程序访问该模块,前进来的程序还未创建出实例,后进来的程序走到了_instance == null 这里,后进来的程序也会开始创建这个实例。为了避免这一情况,可以使用线程锁来解决。

public class Singleton
{
    private static Singleton _instance;
    private static object _instanceLock = new object();
    public static Singleton Instance
    {
        get 
        {
            lock (_instanceLock)
                if (_instance == null)
                {
                    _instance = new Singleton();
                }
            return _instance; 
        }
    }

    private Singleton() { }
}

lock:如果下面程序已经有线程在访问,会将后续程序卡在当前位置,直至前面程序运行完成。

优缺点:

        优点:当需要使用全局属性时,不需要四处引用。

        缺点:全局变量促进耦合

                对并发不友好,会导致线程同步带来的Bug

没有完美的设计模式,开发者需要自行判断使用环境。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值