[整理]C#面向对象设计模式纵横谈(2):Singleton单件(创建型模式)

来源:互联网 发布:pc6软件下载 编辑:程序博客网 时间:2024/05/18 03:00
 
2.1模式分类
从目的来看:
– 创建型(Creational)模式:负责对象创建。
– 结构型(Structural)模式:处理类与对象间的组合。
– 行为型(Behavioral)模式:类与对象交互中的职责分配。
从范围来看:
– 类模式处理类与子类的静态关系。
     对象模式处理对象间的动态关系。
2.2动机(Motivation)
在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。
如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?
这应该是类设计者的责任,而不是使用者的责任。
2.3意图(Intent)
保证一个类仅有一个实例,并提供一个该实例的全局访问点。
——《设计模式》GoF
2.4结构(Structure)
2.5单线程Singleton 模式实现
2.6单线程Singleton模式的几个要点
• Singleton模式中的实例构造器可以设置为protected以允许子类派生。
• Singleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与Singleton模式的初衷违背。
• Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样与Singleton模式的初衷违背。
• Singletom模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们一般没有必要对其销毁进行特殊的管理。
• 不能应对多线程环境:在多线程环境下,使用Singleton模式仍然有可能得到Singleton类的多个实例对象。
 
2.7使用.NET类型初始化机制实现多线程Singleton 模式
2.8 Singleton模式扩展
• 将一个实例扩展到n个实例,例如对象池的实现。
• 将new 构造器的调用转移到其他类中,例如多个类协同工作环境中,某个局部环境只需要拥有某个类的一个实例。
• 理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的实例构造器的任意调用”。
2.9 question & answer
Q使用静态的计数器一样可以在单线程中实现只实例化一个对象的目的啊
A:这个应该是不能的,因为静态计数器的作用和if (instance == null) 是一样的,在多线程环境中都会有问题的。
________________________________________
Q多线成中的lock可以lock(this)?
A:因为是在静态属性中,所以不能访问this指针。
________________________________________
Q为什么双检查?
A:单检查也是可以的,但是单检查的效率要比双检查低——因为同步控制的时间太长了。双检查能够最高效地实现多线程安全的访问。
________________________________________
Q为什么一定要加readonly关键字
A:这个readonly关键字只是不希望客户程序将Instance字段设置为null等不合理的值。
________________________________________
Qremoting里面的Singleton对象应该是使用了Singleton模式吧
A是的,.NET Remoting中的服务器对象激活中就使用了Singleton模式
________________________________________
Q怎样获得类已经构造的实例的个数?
A可以在实例构造器中放一个静态的字段,来表示计数器——在实例构造器中每次做count++即可。
________________________________________
Q怎样区分各个模式,学了很久,总是搞不清楚他们之间的区别,经常性的搞混
A:区分模式的最好办法是搞清楚为什么有这些模式,各个模式分别应对什么样的变化。
________________________________________
Q当好一个程序员必须要学好设计模式吗?它在代码编写过程中有什么好处?怎样可以学好设计模式?
A:不一定,我了解的某些天才程序员对设计模式并不感兴趣——主要是因为他们首先不是面向对象程序员J但是学好设计模式对于一个面向对象程序员有莫大帮助。学好设计模式的关键是深刻理解面向对象。
________________________________________
Qlock 对于singleton本身的类使用使用 helper有什么区别
A:本质上没什么区别,但是别忘了这时候Singleton对象还没有创建J所以这时候不可能lock一个Singleton对象。
________________________________________
Q我有一个疑问,在singleton设计模式下,什么时候,由谁来创建这个实例呢?
ASingleton模式中的“缓式加载”已经说明了Singleton的实例是在客户程序第一次调用GetInstance方法时才会被创建。
________________________________________
 
Q我大致的翻过设计模式这本书,我想请教下您,您认为在设计一个很好的面向对象的软件与程序语言的选择(比如C#C++JAVA)二者之间怎么做到最好的搭配
A:我个人认为这三门语言都是很好的面向对象语言,都能很充分地发挥面向对象的力量。在面向对象层次上,它们的差别并不大。
________________________________________
Q在多线程环境中,使用Static实例化一个对象后,那么它的实例的方法是否可以保证执行时不致冲突?
A:实例方法在多线程环境中无所谓冲突,关键是实例方法操作的实例数据——如果有的话——有可能冲突。
 
原创粉丝点击