实现单例模式的三种高效方式--C++

    题目详解:只能生成一个实例的类,,就是实现了singleton模式的类型
   为了达到只能生成一个实例的目的,我们必须把类的构造函数声明为私有来禁止其他人创建实例。
public  sealed class Singleton
{
private Singleton()//把构造函数定义为私有函数
{
}
private static object sycObj=new object();//设置同步锁,预防多线程情况下,两个线程同时创建实例,加上同步锁之后,在一个时刻只有一个线程能得到同步锁,另一个线程只能等待
private static  Singleton instance=NULL;//只有在instance为空时,才能创建一个实例避免重复创建。
public static Singleton Instance 
{
get 
{
	if(instance==null)
{
lock(syncObj)
{
if(instance==null)
{
       if(instance==null)
{
instance=new Singletion();
}
}
 return  instance;
}
}
}

当instance 为null时,也就是还没有创建时,需要进行加锁操作,创建出来之后,则无需加锁。这个解法使用加锁机制来确保在多线程下只创建一个,实例,两个if实现了比较好的效率。然后代码稍微有点复杂,编写代码时容易出错。

下面是比较优秀的解法

C#中静态构造函数能够确保只调用一次,利用好此方法,能够以简短的代码来实现这个题目

public sealed class Singleton
{
  private Singleton
  {
  }
  private static Singleton instance=new Singleton();
  public static Singleton Instance 
  {
  get
     {
     return  instance ;
     }
   }
  }

在这个方法中,实例instance在第一次使用到Singleton时就会被创建,假设在singleton里面添加一个静态方法,调用该静态方法是不用在创建一个实例的,
这个方法虽然简单,但是,但是过早地创建实例。会让内存使用效率降低。

下面介绍的这种方法,解决了上面过早创建实例的问题,实现了按需创建实例

public sealed class Singleton
{
   Singleton
  {
  }
  
  public static Singleton Instance 
  {
  get
     {
     return  Nested.instance;
     }
   }
   class Nested 
   {
   		static Nested 
   		{
   		}
   internal static  readonly Singleton instance =new Singleton();
   
   }
  }

只有当我们通过Singleton.Instance来得到Singleton 的实例时,才会调用nested的静态构造函数来创建实例instance,当我们不调用Singleton,Instance 时,nested不会被调用,也不会创建实例。

结论:第一种方法,两次判断和一次加锁确保多线程下高效率的工作
第二种方法,利用C#静态构造函数的特性,第三种方法利用私有嵌套类型的特性,按需创建,提高了空间使用效率。

PS:本人最近在复习相关的知识,看到相关的题目觉得值得分享,若有错误欢迎指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值