c语言单例模式,c#单例模式(Singleton)的6种实现

单例模式用于保证一个类只有一个实例,本文详细介绍了在C#和C语言中实现单例的6种方式,包括线程不安全、线程安全、双检锁和静态初始化等,分析了各自的优缺点和适用场景。内容涵盖线程安全性、性能影响和生命周期管理,旨在帮助开发者理解并正确应用单例模式。
摘要由CSDN通过智能技术生成

1.1.1 摘要

在我们日常的工作中经常需要在应用程序中保持一个唯一的实例,如:IO处理,数据库操作等,由于这些对象都要占用重要的系统资源,所以我们必须限制这些实例的创建或始终使用一个公用的实例,这就是我们今天要介绍的——单例模式(Singleton)。

使用频率

902dbb448e58a1d6d4e64d935ae07ff7.gif

单件模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。

1.1.2 正文

eac1c55a55def80f288eeb579e9d2cb2.gif

图1单例模式(Singleton)结构图

单例模式(Singleton)是几个创建模式中最对立的一个,它的主要特点不是根据用户程序调用生成一个新的实例,而是控制某个类型的实例唯一性,通过上图我们知道它包含的角色只有一个,就是Singleton,它拥有一个私有构造函数,这确保用户无法通过new直接实例它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance()方法负责检验并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。

9b7f3671478a17a96b5eae397d3084b4.png

图2单例模式(Singleton)逻辑模型

接下来我们将介绍6中不同的单例模式(Singleton)的实现方式。这些实现方式都有以下的共同点:

1.有一个私有的无参构造函数,这可以防止其他类实例化它,而且单例类也不应该被继承,如果单例类允许继承那么每个子类都可以创建实例,这就违背了Singleton模式“唯一实例”的初衷。

2.单例类被定义为sealed,就像前面提到的该类不应该被继承,所以为了保险起见可以把该类定义成不允许派生,但没有要求一定要这样定义。

3.一个静态的变量用来保存单实例的引用。

4.一个公有的静态方法用来获取单实例的引用,如果实例为null即创建一个。

版本一线程不安全

///

/// A simple singleton class implements.

///

public sealed class Singleton

{

private static Singleton _instance = null;

///

/// Prevents a default instance of the

/// class from being created.

///

private Singleton()

{

}

///

/// Gets the instance.

///

public static Singleton Instance

{

get { return _instance ?? (_instance = new Singleton()); }

}

}

以上的实现方式适用于单线程环境,因为在多线程的环境下有可能得到Singleton类的多个实例。假如同时有两个线程去判断

(null == _singleton),并且得到的结果为真,那么两个线程都会创建类Singleton的实例,这样就违背了Singleton模式“唯一实例”的初衷。

版本二线程安全

///

/// A thread-safe singleton class.

///

public sealed class Singleton

{

private static Singleton _instance = null;

private static readonly object SynObject = new object();

Singleton()

{

}

///

/// Gets the instance.

///

public static Singleton Instance

{

get

{

// Syn operation.

lock (SynObject)

{

return _instance ?? (_instance = new Singleton());

}

}

}

}

以上方式的实现方式是线程安全的,首先

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值