单例模式以及在C#中的使用
2013-06-18 11:51
99 查看
下面做一些简要的说明。
1.
单例模式(Singleton Pattern),又称作单件模式,当然也有一种诙谐的称谓:单身模式。在经典的GoF所著的《Design Patterns》一书中,对单例模式有着详尽的介绍,这本书网上有全文版本。
2.
单例模式的意图是保证一个类仅有一个实例,并且要提供一个全局访问点来访问这个实例。通常这个全局访问点是一个静态方法或者C#中的一个属性。
3.
在C#中,典型的单例模式实现方法可以如下:
当外部需要
4.
问题肯定不会这么简单就被解决,比如在多线程环境中,上述代码就会有很大的隐患。
有一种情况很常见:两个线程同时调用
当某一个线程由于
上面两种情况,很显然都会创建
利用C#的特性,我们可以把一个线程先锁住(
代码中用到了双重检查锁定(double check locking)的技术,是为了提高性能考虑,因为C#中
5.
单例模式有两种实现方式,主要基于构建的方式不同:
延迟初始化(Lazy Initialization),也叫“懒汉模式”:单例实例在第一次使用时被构建;
热初始化(Eager Initialization),也叫“恶汉模式”:单例实例在类加载时创建
前面创建单例模式的方式都属于延迟初始化。.NET 4.0以后提供了一个
C#使用静态初始化来完成单例模式中的热初始化。需要注意的是,不需要考虑多线程的问题,因为CLR会自动解决多线程同步的问题。如果程序经常要用到这个实例,运用热初始化可以显著提高性能。
6.
StackOverflow中对于单例模式都是持否定态度的,比如这个:
In theory: when you need to restrict the instantiation of an object to one instance. In practice: never.
主要基于下面几个原因:
违反了单一职责原则
耦合度过大
单元测试基本无法进行
开发混淆,造成混乱。比如作为API提供的时候。
总之,
There‘s at most a can use but there no need.
文章来源:http://laobian.me/2013/02/singleton-pattern-with-csharp.html
1.
单例模式(Singleton Pattern),又称作单件模式,当然也有一种诙谐的称谓:单身模式。在经典的GoF所著的《Design Patterns》一书中,对单例模式有着详尽的介绍,这本书网上有全文版本。
2.
单例模式的意图是保证一个类仅有一个实例,并且要提供一个全局访问点来访问这个实例。通常这个全局访问点是一个静态方法或者C#中的一个属性。
3.
在C#中,典型的单例模式实现方法可以如下:
Manager的实例时,可以调用
GetInstance()这个静态方法。由于
Manager类的构造器是私有的,这也就避免了其他方式实例化这个
Manager类。
GetInstance()方法内部的实现,保证了全局中只有一个
Manager实例。
4.
问题肯定不会这么简单就被解决,比如在多线程环境中,上述代码就会有很大的隐患。
有一种情况很常见:两个线程同时调用
GetInstance()方法;
当某一个线程由于
Mgr为
null而进入条件判断代码块的时候,而恰恰还没有执行实例化一个
Manager对象,这时候另一个线程由于
Mgr为
null,所以也会进入这个条件语句中
上面两种情况,很显然都会创建
Manager实例,这也就违背了单例模式的意图了。
利用C#的特性,我们可以把一个线程先锁住(
lock),等到这个线程完成后,再让下一个线程访问
GetInstance()方法:
lock语句是很耗性能的。第一道检查,是基于如果
Mgr不为
null的时候就不需要
lock了,提高性能。第二道检查,是基于两个线程同时通过第一道检查后,第一个线程解锁后,由于
Mgr此时已经不为
null,所以第二个线程就不用实例化
Manager了。
5.
单例模式有两种实现方式,主要基于构建的方式不同:
延迟初始化(Lazy Initialization),也叫“懒汉模式”:单例实例在第一次使用时被构建;
热初始化(Eager Initialization),也叫“恶汉模式”:单例实例在类加载时创建
前面创建单例模式的方式都属于延迟初始化。.NET 4.0以后提供了一个
Lazy<T>泛型类,可以被应用于这个场景,省却代码的编写量。
Lazy<T>的构造器重载版本可以帮我们解决多线程的问题。
C#使用静态初始化来完成单例模式中的热初始化。需要注意的是,不需要考虑多线程的问题,因为CLR会自动解决多线程同步的问题。如果程序经常要用到这个实例,运用热初始化可以显著提高性能。
StackOverflow中对于单例模式都是持否定态度的,比如这个:
In theory: when you need to restrict the instantiation of an object to one instance. In practice: never.
主要基于下面几个原因:
违反了单一职责原则
耦合度过大
单元测试基本无法进行
开发混淆,造成混乱。比如作为API提供的时候。
总之,
There‘s at most a can use but there no need.
文章来源:http://laobian.me/2013/02/singleton-pattern-with-csharp.html
相关文章推荐
- C#中使用正则的贪婪和非贪婪模式,以及分组
- C#策略模式(Strategy Pattern) 使用实例
- C# web中listbox的使用以及删除等操作
- 【angular】组件:@Input() @Output() 输入属性和输出属性以及中间人模式的使用 (一)
- 【angular】组件:@Input() @Output() 输入属性和输出属性以及中间人模式的使用 (一)
- Java中static键字的思考以及使用static创建单例模式
- c#中的委托、事件、Func、Predicate、Observer设计模式以及其他
- C#控件使用以及整理
- C#hashtable使用说明 以及 Hashtable和HashMap的区别【总结性】
- 单例模式使用 懒汉模式和饿汉模式以及使用enum方式的性能测试
- C#.net制作验证码(英文与数字组成的4位随机数),以及MD5值的使用
- C# 7.0 观察者模式 以及 delegate 和 event
- C#设计模式:单件模式以及其扩展和思考
- 在Visual Studio Code中使用C#以及.net core
- ES的查询模式以及使用场景:
- CentOS7下安装Mysql和Memcached 以及 使用C#操作Mysql和Memcached
- C#使用Dotfuscator混淆代码以及加密
- 扩展无极限:工厂设计模式与C#扩展方法的结合使用
- C#索引器与属性的区别,以及索引器使用方法
- 通过例子学设计模式之--简单工厂模式以及使用场景说明(C++实现)