编程语言
首页 > 编程语言> > 设计模式学习系列-C#的单件模式

设计模式学习系列-C#的单件模式

作者:互联网

原文链接:http://www.cnblogs.com/wysky/archive/2008/07/23/csharp_singleton.html

今天学习了.Net的单件模式.主要为三种.

1、单线程环境下的单件模式实现

 PS. 如果缺少private,编译器会自动生成一个public的构造。所以必须声明一个私有的private构造函数.

using System;

namespace Singleton
ExpandedBlockStart.gifContractedBlock.gif{
    public class Singleton
ExpandedSubBlockStart.gifContractedSubBlock.gif    {
ExpandedSubBlockStart.gifContractedSubBlock.gif        private Singleton() { }
        private static Singleton instance;
        public static Singleton Instance
ExpandedSubBlockStart.gifContractedSubBlock.gif        {
            get
ExpandedSubBlockStart.gifContractedSubBlock.gif            {
                if(instance == null)
                    instance = new Singleton();
                return instance;
            }
        }
    }
}

 

2、多线程下使用双重锁定的实现

using System;

namespace SigletonPattern.Sigleton
ExpandedBlockStart.gifContractedBlock.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif/**//// <summary>
/// 功能:在C#用双重锁定实现单件模式
/// 编写:Terrylee
/// 日期:2005年12月06日
/// </summary>
public class DoubLockSigleton
ExpandedSubBlockStart.gifContractedSubBlock.gif{

//volatile 表示编译器不能自动优化调试语句.(避免调整语句位置和顺序导致初始化时间点不正确.sky)
private static volatile DoubLockSigleton instance;

ExpandedSubBlockStart.gifContractedSubBlock.gif/**//// <summary>
/// 辅助锁对象,本身没有意义
/// </summary>
private static object syncRoot = new Object();

ExpandedSubBlockStart.gifContractedSubBlock.gif/**//// <summary>
/// 构造方法改为Private
/// </summary>
private DoubLockSigleton()
ExpandedSubBlockStart.gifContractedSubBlock.gif{

}

public static DoubLockSigleton Instance
ExpandedSubBlockStart.gifContractedSubBlock.gif{
get
ExpandedSubBlockStart.gifContractedSubBlock.gif{
if (instance == null)
ExpandedSubBlockStart.gifContractedSubBlock.gif{
lock (syncRoot)
ExpandedSubBlockStart.gifContractedSubBlock.gif{
if (instance == null)
instance = new DoubLockSigleton();
}
}

return instance;
}
}

}
}

3、传说为MSDN中的一篇文章提供的方法,利用C#的静态属性和静态构造函数处理原理实现的单件模式。

 

using System;

namespace Singleton
ExpandedBlockStart.gifContractedBlock.gif{
    public class Singleton
ExpandedSubBlockStart.gifContractedSubBlock.gif    {
        private static readonly Singleton instance = new Singleton();
ExpandedSubBlockStart.gifContractedSubBlock.gif        private Singleton() { }
    }
}

 

编译后查看il可以发现其实是等同于下面的代码的

using System;

namespace Singleton
ExpandedBlockStart.gifContractedBlock.gif{
    public class Singleton
ExpandedSubBlockStart.gifContractedSubBlock.gif    {
        private static readonly Singleton instance;
        static Singleton()
ExpandedSubBlockStart.gifContractedSubBlock.gif        {
            instance = new Singleton();
        }
ExpandedSubBlockStart.gifContractedSubBlock.gif        private Singleton() { }
    }
}

 

由于C#静态属性和静态构造函数机制,调用静态属性 instance的时候,会先执行类的静态构造函数,而且保证同时只有一个线程能够执行静态构造函数.因此实现了单件模式.

 

 

 

转载于:https://www.cnblogs.com/wysky/archive/2008/07/23/csharp_singleton.html

标签:Singleton,C#,单件,private,instance,static,设计模式,public,构造函数
来源: https://blog.csdn.net/weixin_30764771/article/details/94961448