C#单例模式Singleton的实现详解

 更新时间:2023年05月26日 08:25:24   作者:橙子家  
单例模式(Singleton Pattern)是日常开发中最简单的设计模式之一,它提供了一种创建对象的最佳方式,本文主要为大家介绍的是C#单例模式的实现方法,需要的可以参考一下

一、简介

1、什么是单例模式

一句话解释:

单一的类,只能自己来创建唯一的一个对象。

单例模式(Singleton Pattern)是日常开发中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有一个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象

一个比喻:(班主任与学生)

比如一个班级,只有一个班主任,任何一个同学要找班主任,都是找的同一个,班主任忙的时候,当然就出现排队的情况。

2、优缺点和使用场景

  • 优点:内存里只有一个实例,减少了内存的开销,也避免了对象高频创建带来的性能损耗。
  • 缺点:任务量大时,会出现排队,耗时增加。另外与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

 使用场景举例:

  • 要求生产唯一序列号。
  • WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
  • 创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

二、单例模式简单实现

public class Singleton
{
    private static Singleton instance = null;
    private static object lockObject = new object();
    /// <summary>
    /// 私有化构造函数,防止外部实例化
    /// </summary>
    private Singleton() { }
    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (lockObject) // 线程同步锁
                {
                    if (instance == null) // Lazy Initialization
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
    /// <summary>
    /// 重置 Singleton
    /// </summary>
    public void Reset()
    {
        instance = null;
    }
}

测试代码:

static void Main(string[] args)
{
    var instance1 = Singleton.Instance;
    var instance2 = Singleton.Instance;
    Console.WriteLine(instance1 == instance2); // 输出 true 
}

三、带参数的单例模式实现

public class SingletonParameters
{
    private static SingletonParameters instance = null;
    private static object lockObject = new object();
    private int _firstvalue, _secondvalue;
    /// <summary>
    /// 私有化构造函数,防止外部实例化
    /// </summary>
    private SingletonParameters(int first, int second)
    {
        this._firstvalue = first;
        this._secondvalue = second;
    }
    public static SingletonParameters InstanceParameters(int first, int second)
    {
        if (instance == null)
        {
            lock (lockObject) // 线程同步锁
            {
                if (instance == null) // Lazy Initialization
                {
                    instance = new SingletonParameters(first, second);
                }
            }
        }
        else
        {
            instance.FirstValue = first;
            instance.SecondValue = second;
        }
        return instance;
    }
    public int FirstValue { get { return _firstvalue; } set { _firstvalue = value; } }
    public int SecondValue { get { return _secondvalue; } set { _secondvalue = value; } }
    /// <summary>
    /// 重置 Singleton
    /// </summary>
    public void Reset()
    {
        instance = null;
    }
}

 测试代码:

var instance1 = SingletonParameters.InstanceParameters(1, 2);
Console.WriteLine($"FirstValue:{instance1.FirstValue}");
Console.WriteLine($"SecondValue:{instance1.SecondValue}");
var instance2 = SingletonParameters.InstanceParameters(3, 4);
Console.WriteLine($"FirstValue:{instance2.FirstValue}");
Console.WriteLine($"SecondValue:{instance2.SecondValue}");
Console.WriteLine($"instance1 == instance2 : {instance1 == instance2}");

到此这篇关于C#单例模式Singleton的实现详解的文章就介绍到这了,更多相关C#单例模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c#定时器和global实现自动job示例

    c#定时器和global实现自动job示例

    这篇文章主要介绍了c#定时器和global实现自动job示例,大家参考使用吧
    2014-01-01
  • C#的通用DbHelper类(支持数据连接池)示例详解

    C#的通用DbHelper类(支持数据连接池)示例详解

    这篇文章主要介绍了C#的通用DbHelper类支持数据连接池,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • XAML如何获取元素的位置

    XAML如何获取元素的位置

    这篇文章主要为大家详细介绍了XAML如何获取元素的位置,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Unity3D启动外部程序并传递参数的实现

    Unity3D启动外部程序并传递参数的实现

    这篇文章主要介绍了Unity3D启动外部程序并传递参数的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Unity3D实现渐变颜色效果

    Unity3D实现渐变颜色效果

    这篇文章主要为大家详细介绍了Unity3D实现渐变颜色效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • DevExpress之ChartControl用法实例总结

    DevExpress之ChartControl用法实例总结

    这篇文章主要介绍了DevExpress之ChartControl用法实例总结,需要的朋友可以参考下
    2014-08-08
  • C#设计模式实现之迭代器模式

    C#设计模式实现之迭代器模式

    迭代器模式把对象的职责分离,职责分离可以最大限度减少彼此之间的耦合程度,从而建立一个松耦合的对象,这篇文章主要给大家介绍了关于C#设计模式实现之迭代器模式的相关资料,需要的朋友可以参考下
    2021-08-08
  • C# 创建报表过程详解

    C# 创建报表过程详解

    本文给大家介绍的是使用vs2012 c#创建报表的全部过程的记录,十分的详细,有需要的小伙伴可以参考下。
    2015-06-06
  • C#汉字转拼音实例(支持多音字)

    C#汉字转拼音实例(支持多音字)

    几年前就在网上看到过汉字转拼音的程序,大都就是按汉字的编码转换,单字对应的算法实现的。但是都有一个共同的缺点,不能支持多音字。本篇文章主要介绍了C#汉字转拼音实例(支持多音字),有兴趣的可以了解一下。
    2016-12-12
  • C#实现Winform版计算器

    C#实现Winform版计算器

    这篇文章主要为大家详细介绍了C#实现Winform版计算器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05

最新评论