【C#面向对象设计模式】02. Singleton单件(创建型模式)

本文介绍了C#中的Singleton单例模式,讨论了其创建动机、结构以及在单线程和多线程环境下的实现方法。还探讨了Singleton模式的扩展和.NET框架中的应用实例。
摘要由CSDN通过智能技术生成

【C#面向对象设计模式】02. Singleton单件(创建型模式)

0. 模式分类

  • 从目的来看:
    • 创建型模式:负责对象创建。
    • 结构型模式:处理类与对象间的组合。
    • 行为型模式:类与对象交互中的职责分配。
  • 从范围来看:
    • 类模式处理类与子类的静态关系。
    • 对象模式处理对象间的动态关系。

1. 动机

  • 在软件系统中,经常有这样一些特殊的类,必须保证他们在系统中只存在一个实例,才能确保他们的逻辑正确性、以及良好的效率。
  • 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?
  • 这应该是类设计者的责任,而不是使用者(客户程序)的责任。

2. 意图

保证一个类仅有一个实例,并且提供一个该实例的全局访问点。实际上是对实例个数的控制。

3. 结构

在这里插入图片描述

4. 单线程Singleton模式实现

public class Singleton
{
    private static Singleton instance;

    private Singleton() { }

    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
}

5. 单线程Singleton模式的几个要点

  • Singleton模式中的实例构造器可以设置为protected以允许子类派生。
  • Singleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与Singleton模式的初衷违背。
  • Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样与Singleton模式的初衷违背。
  • Singleton模式只考虑到了对象创建的管理,没有考虑到对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们一般没有必要对其销毁进行特殊的管理。
  • 不能应对多线程环境,在多线程环境下,使用Singleton模式仍然有可能得到Singleton类的多个实例对象。

6. 多线程Singleton模式实现

public class Mul_Singleton
{
    private static volatile Mul_Singleton instance = null;//volatile 可以保证编译不会对代码进行微调,非常严格的执行代码

    private static object lockHelper = new object();//辅助语句,只是为了满足lock的需要

    private Mul_Singleton() { }

    public static Mul_Singleton Instance
    {
        get
        {
            if(instance == null)
            {
                lock(lockHelper)//double check
                {
                     if (instance == null)
                        {
                            instance = new Mul_Singleton();
                        }
                       
                }
            }
            return instance;
        }
    }
}
class Static_Singleton
{
    public static readonly Static_Singleton instance = new Static_Singleton();//.NET的机制导致了静态构造器不可能有多线程执行

    private Static_Singleton() { }//也能实现多线程,但只能适用于构造器无参的情况
}
public class Mul_Singleton
{
    //多线程带参
    private static volatile Mul_Singleton instance = null;

    private static object lockHelper = new object();
    private Mul_Singleton(int x, int y) 
    {
        this.x = x;
        this.y = y;
    }

    public static Mul_Singleton GetInstance(int x, int y)
    {
        get
        {
            if(instance == null)
            {
                lock(lockHelper)//double check
                {
                     if (instance == null)
                        {
                            instance = new Mul_Singleton(x, y);
                        }
                        else
                        {
                            instance.x = x;
                            instance.y = y;
                        }
                       
                }
            }
            return instance;
        }
    }
}

7. Singleton模式扩展

  • 将一个实例扩展到n个*(固定个数)*实例,例如对象池的实现。
  • 将new构造器的调用转移到其他类中,例如多个类协同工作环境中,某个局部环境只需要拥有某个类的一个实例。
  • 理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的实例构造器的任意调用”。

8. .NET框架中的Singleton引用

MyClass c1 = new MyClass();
MyClass c2 = new MyClass();

Type t1 = c1.GetType();
Type t2 = c2.GetType();

Console.WriteLine(t1==t2);
//类型相同,只会有一个实例
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值