惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
博客园 - 叶小钗
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
腾讯CDC
S
SegmentFault 最新的问题
D
DataBreaches.Net
Hugging Face - Blog
Hugging Face - Blog
L
LangChain Blog
Recent Announcements
Recent Announcements
阮一峰的网络日志
阮一峰的网络日志
N
Netflix TechBlog - Medium
大猫的无限游戏
大猫的无限游戏
M
MIT News - Artificial intelligence
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 三生石上(FineUI控件)
F
Fortinet All Blogs
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Martin Fowler
Martin Fowler
雷峰网
雷峰网
J
Java Code Geeks
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
小众软件
小众软件
云风的 BLOG
云风的 BLOG
T
Tailwind CSS Blog

博客园 - 文's sky

泛型列表(List)的搜索和排序 [笔记]读取含日期格式的记录SQLite报错"该字符串未被识别为有效的 DateTime"的问题 FtpWebRequest 的杂症 - "The server committed a protocol violation","基础连接已经关闭: 服务器提交了协议冲突" SqlServer 2000默认开启连接池 ASP 整合ASP.NET的URL参数编码问题 - 文's sky 序列化遇到"不应有的节点" 转换链接的正则 一、NVelocity介绍 NVelocity开篇 准确计算时间差 EXPLORER自动连接221.5.250.163 ASP.NET C# 验证码 支持中文 噪点 弯曲 模板机制的第一个程序Hello World [笔记]DataView格式化显示数据不能的问题 .Net论坛,让人看笑话~ 实在受不了了,大家来帮帮我如何调用这个C++/CLI的DLL C#外挂专用截取显示器图像代码 C#游戏外挂代码 重置递增号
设计模式学习系列-C#的单件模式
文's sky · 2008-07-23 · via 博客园 - 文's sky

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

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

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

using System;

namespace Singleton
{
    
public class Singleton
    
{
        
private Singleton() { }

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

        }

    }

}

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

using System;

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

public class DoubLockSigleton
{

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

/// <summary>
/// 辅助锁对象,本身没有意义
/// </summary>

private static object syncRoot = new Object();

/// <summary>
/// 构造方法改为Private
/// </summary>

private DoubLockSigleton()
{

}


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

}


return instance;
}

}


}

}

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

using System;

namespace Singleton
{
    
public class Singleton
    
{
        
private static readonly Singleton instance = new Singleton();
        
private Singleton() { }
    }

}

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

using System;

namespace Singleton
{
    
public class Singleton
    
{
        
private static readonly Singleton instance;
        
static Singleton()
        
{
            instance 
= new Singleton();
        }

        
private Singleton() { }
    }

}

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