单例模式及常见写法分析(设计模式01)
——《设计模式》
单例模式的概念很简单,下面以C#语言为例子,列出常见单例写法的优缺点。
1、简单实现public sealed class Singleton static Singleton instance = null; public void Show() Console.WriteLine( "instance function"); private Singleton() public static Singleton Instance if (instance == null) instance = new Singleton(); return instance; }评注:
对于线程来说不安全
单线程中已满足要求
优点:
由于实例是在 Instance 属性方法内部创建的,因此类可以使用附加功能
直到对象要求产生一个实例才执行实例化;这种方法称为“惰性实例化”。惰性实例化避免了在应用程序启动时实例化不必要的 singleton。
public sealed class Singleton static Singleton instance = null; private static readonly object padlock = new object(); private Singleton() public static Singleton Instance lock (padlock) if (instance == null) instance = new Singleton(); return instance; }
同一个时刻加了锁的那部分程序只有一个线程可以进入
对象实例由最先进入的那个线程创建
后来的线程在进入时(instence == null)为假,不会再去创建对象实例
增加了额外的开销,损失了性能
public sealed class Singleton static Singleton instance = null; private static readonly object padlock = new object(); private Singleton() public static Singleton Instance if (instance == null) lock (padlock) if (instance == null) instance = new Singleton(); return instance; }评注:
多线程安全
线程不是每次都加锁
允许实例化延迟到第一次访问对象时发生
public sealed class Singleton private static readonly Singleton instance = null; static Singleton() instance = new Singleton(); private Singleton() public static Singleton Instance return instance; }评注:
依赖公共语言运行库负责处理变量初始化
公共静态属性为访问实例提供了一个全局访问点
对实例化机制的控制权较少(.NET代为实现)
静态初始化是在 .NET 中实现 Singleton 的首选方法
小注:
静态构造函数既没有访问修饰符,C#会自动把他们标记为private,之所以必须标记为private,
是为了阻止开发人员写的代码调用它,对它的调用总是由CLR负责的。
public sealed class Singleton private Singleton() public static Singleton Instance return Nested.instance; public static void Hello() private class Nested internal static readonly Singleton instance = null; static Nested() instance = new Singleton(); }评注:
初始化工作由Nested类的一个静态成员来完成,这样就实现了延迟初始化。
由于静态函数的调用时机,是在类被实例化或者静态成员被调用的时候进行调用,并且是由.net框架来调用静态构造函数来初始化静态成员变量, 所以,如果按照写法四来写,再调用Hello方法的时候,就会实例化出来Singleton实例,这不是我们想看到的,因为我们有可能只是想用Hello方法,而不是别的。
注意事项:
1、Singleton模式中的实例构造器可以设置为protected以允许子类派生。
2、Singleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与Singleton模式的初衷违背。
3、Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样与Singleton模式的初衷违背。
4、Singletom模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们一般没有必要对其销毁进行特殊的管理。
总结:
1、Singleton模式是限制而不是改进类的创建。
2、理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的构造器的任意调用”。
3、可以很简单的修改一个Singleton,使它有少数几个实例,这样做是允许的而且是有意义的。
作者:jiankunking 出处:http://blog.csdn.net/jiankunking
本文部分内容来自网络,截图部分来自《CLR.via.C#第三版》
相关文章
- 看透设计模式-行为型模式
- 设计模式的C语言应用-访问者模式-第九章
- 设计模式的C语言应用-外观模式-第八章
- 装饰模式----设计模式系列
- 设计模式——代理模式
- 炒冷饭系列:设计模式 装饰模式
- 设计模式(三)建造者模式Builder(创建型)
- iOS设计模式之简单工厂模式
- iOS设计模式之备忘录模式
- C#设计模式——原型模式(Prototype Pattern)
- 设计模式 -- 备忘录模式
- 《从零开始学Swift》学习笔记(Day 52)——Cocoa错误处理模式
- Builder 建造者模式 [MD]
- Command 命令模式 MD
- 责任链模式Scala的7种实现
- 简介Python设计模式中的代理模式与模板方法模式编程
- 设计模式复习--简单工厂模式
- 【java设计模式】之 建造者(Builder)模式
- 单例模式及常见写法分析(设计模式01)
- 基于H7的串口WIFI模块ESP8266的TCP客户端例子和操作说明(AP兼STA模式)
- Atitit. 解释器模式框架选型 and应用场景attilax总结 oao
- 具有交叉信号模式的色散信号的群延迟(色散曲线)估计和模式分离(Matlab代码实现)
- 实践GoF的23种设计模式:建造者模式
- 科技感满满,华为云DevCloud推出网页暗黑模式
- Java——设计模式(装饰模式_IO)
- Activity启动模式 及 Intent Flags 与 栈 的关联分析
- 【Nginx】如何基于主从模式搭建Nginx+Keepalived双机热备环境?这是最全的一篇了!!
- java-信息安全(二)-对称加密算法工作模式ECB,CBC,CRT、DES,3DES,AES,Blowfish,RC2,RC4
- 设计模式入门之桥接模式Bridge
- 大话设计模式C++达到-文章12章-外观模式
- 设计模式(Python语言)----单例模式
- 【设计模式】桥接模式(C#)
- 23中设计模式11-责任链模式