模式分类:
从目的来看:
-创建型模式:负责对象创建
-结构型模式:处理类与对象之间的组合关系
-行为型模式:类与对象交互中的职责分配
从范围来看:
-类模式处理类与子类的静态关系
-对象模式处理对象间的动态关系
单例模式的意图就是保证一个类只有一个实例,并提供一个该实例的全局访问点。
public class Singleton
{
private static Single instance;
private Singleton(){}
public static Singleton Instance
{
get
{
if (instance == null) instance = new Singleton();
return instance;
}
}
}
class Test
{
public static void Main(){
Singleton t1 = Singleton.Instance;
Singleton t2 = Singleton.Instance;
Console.WriteLine(Object.ReferenceEquals(t1, t2) == true);
}
}
==============================
singleton模式中的实例构造器可以设置为protected以允许子类派生。
singleton模式一般不要支持ICloneable接口,因为这会导致多个对象实例,与singleton模式的初衷违背。
singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样与Singleton模式的初衷违背
singleton模式只考虑到对象创建的管理,没有考对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们一般没有必要对其销毁进行特殊处理。
不能应对多线程环境:在多线程环境下,使用singleton模式仍然有可能得到singleton类的多个实例对象
多线程下:
class Singleton
{
private static volatile Singleton install = null;
private static object lockHelper = new Object();
private Singleton(){}
public static Singleton Instance
{
get{
lock (lockHelper)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
}
}
======
当然还有一种简洁方式可以保证多线程环境下的单例模式,就是利用静态构造器
在多线程模式下,静态构造器只被创建一次
class Singleton{
public static readonly Singleton Instance = new Singleton();
private Singleton(){}
}
其实这段代码等价于:
class Singleton{
public static readonly Singleton Instance;
//多线程环境下只能有一个线程执行它,也就是说免费加锁
static Singleton(){
Instance = new Singleton();
}
private Singleton(){}
}
=========
singleton模式扩展:
*将一个实例扩展到n个实例,例如对象池的实现
*将new构造器的调用移到其他类中
*核心就是如何控制用户使用new对一个类的实例构造器的任意调用