C#设计模式之单例模式(Singleton Pattern)

本文深入解析了单例模式的概念及其实现方式,包括其在确保系统中某对象唯一性方面的重要性,并提供了懒汉式和饿汉式的代码示例。

单例模式解释: 

       一个类有且仅有一个实例,并且自行实例化向整个系统提供。这一模式的目的是使得类的一个对象成为系统中的唯一实例。

模式类型: 创造类模式

使用时机:

       对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。

特征:

1.某个类只能有一个实例

2.它必须自行创建这个实例

3.它必须自行向整个系统提供这个实例

       从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。

UML图:


代码实现:

1.懒汉式 + 双重锁:

public class Singleton
    {
        private static Singleton instance;
        private static readonly object syncRoot = new object();
        private Singleton()
        {  }
        public static Singleton GetInstance()
        {
            if (instance == null)
            {
                lock (syncRoot)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
public class Program
    {
        static void Main(string[] args)
        {
            Singleton s1 = Singleton.GetInstance();
            Singleton s2 = Singleton.GetInstance();
            if (s1 == s2)
            {
                Console.WriteLine("Objects are the same instance");
            }
            Console.Read();
        }
    }

2.饿汉式:

sealed: 阻止发生派生,而派生可能会增加实例

public sealed class Singleton
    {
        <span style="font-family: arial, 宋体, sans-serif;">//静态初始化.不需要显示编写线程安全代码(如双重锁).即可解决多程线环境下不安全的问题</span>
    private static readonly Singleton instance = new Singleton(); //在第一次引用类的任何成员时创建实例.
        private Singleton()
        {  }
        public static Singleton GetInstance()
        {
            return instance;
        }
    }
public class Program
    {
        static void Main(string[] args)
        {
            Singleton s1 = Singleton.GetInstance();
            Singleton s2 = Singleton.GetInstance();
            if (s1 == s2)
            {
                Console.WriteLine("Objects are the same instance");
            }
            Console.Read();
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值