3、意图(Intent)
保证一个类仅有一个实例,并提供一个该实例的全局访问点。
——《设计模式》GoF设计模式
4、单线程Singleton模式实现
public class Singleton
{
private static Singleton _instance;
//重点在这,私有构造,不让外部new
private Singleton()
{
}
public static Singletoon Instance
{
get
{
if (_instance == null)
{
_instance = new Singleton();
}
return _instance;
}
}
}多线程
class Test
{
public static void Main()
{
Singleton t1 = Singleton.Instance;
Singleton t2 = Singleton.Instance;
//查看t1, t2的引用是否相等
Console.WriteLine(Object.ReferenceEquals(t1, t2) == true);
}
}编辑器
5、单线程Singleton模式的几个要点
1)Singleton模式中的实例构造器能够设置为protected以容许子类派生。
2)Singleton模式通常不要支持ICloneable接口,由于这能够会致使多个对象实例,与Singleton模式的初衷违背。由于IClonealbe是克隆浅拷钡。
3)Singleton模式通常不要支持序列化,由于这也有可能致使多个对象实例,一样与Singleton模式初衷违背。序列化能实现克隆的深拷钡。
4)Singleton模式只考虑到了对象建立的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来说,咱们通常没有必要 对其销毁进行特殊的管理。
5)不能应对多线程环境:在多线程环境下,使用Singleton模式仍然有可能获得Singleton类的多个实例对象。
6、多线程单件
1)第一实现方法
public class Singleton
{
/* 关键字volatile保证严格意义的多线程不会出现微调,严格按顺序执行,
若是删除关键字volatile,编辑器有可能对代码进行微调,仍是有可能出现new屡次的状况*/
private static volatile Singleton _instance = null;
// 辅助器,本向不参与真正意义的构建
private static object _lockHelper = new Object();
private Singleton()
{
}
// 没有参数时使用静态属性,有参数时应使用方法GetInstance
public static Singleton Instance
{
get
{
if (_instance == null)
{
lock (_lockHelper) // 锁住_lockHelper,避免多线程的访问
{
if (instance == null)//双检查
{
_instance = new Singleton();
}
}
}
return _instance;
}
}
// 带参数的实现以下
private int x;
private int y;
private Singleton(int x, int y)
{
this.x = x;
this.y = y;
}
public Singleton GetInstance(int x, int y)
{
if (_instance == null)
{
_instance = new Singleton(x, y);
}
else
{
_instance.x = x;
_instance.y = y;
}
return _instance;
}
}
2)第二种实现方法:不支持参数化的构造
//sealed须要不须要看实际状况
sealed class Singleton
{
//类连初始化,实际上会在静态构造器里面初始化
public static readonly Singleton Instance = new Singleton();
private int _X;
private int _Y;
private Singleton()
{
}
public void Init(FileStream fs)
{
}
public int X
{
get
{
return _X;
}
set
{
this._X = value;
}
}
public int Y
{
get
{
return _Y;
}
set
{
this._Y = value;
}
}
}this
上面的方法等同于下面的方法
sealed class Singleton
{
public static readonly Singleton Instance;
//静态构造器,只在静态字段初始化前初始化
static Singleton()
{
Instance = new Singleton();
}
private Singleton()
{
}
}线程
class Test
{
public static void Main()
{
singleton instance = Singleton.Instance;
instance.Init(new FileStream("..."));
instance.X = 100;
instance.Y = 200;
Console.WriteLine(instance);
}
}设计
7、Singleton模式扩展
1)Singleton模式是对建立对象个数的控制。将一个实例扩展到n个实例,例如对象池的实现。建立n个实例放入到集合对象中,供用户使用,达到资源的有效管理。
2)将new构造的调用转移到其余类中,例如多个类协同工做环境中,某个局部环境只须要拥有某个类的一个实例。
3)理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的实例构造器的任意调用”。
对象