1.如何保证单态模式只有一个全局唯一的实例。
2.如何保证提供一个访问它的全局访问点。
单态模式的使用场合:
1.类只有一个实例,并且可以在全局访问时。这个唯一的实例应该可以通过子类实现扩展,并且用户无须更改代码即可使用。
2.工厂类就经常被实例化为全局的唯一的实例。
实现技巧:
1.私有的构造器。
2.静态属性和方法。
UML类图:

代码实现:
1.不考虑多线程:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GofSingleton
{
public class Singleton
{
private static Singleton instance;
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
num--;
}
return instance;
}
}
private static int num = 1;
public static int Num
{
get
{
return num;
}
}
private Singleton() //定义私有构造函数
{
Console.WriteLine("在没有考虑多线程的条件下,利用Singleton模式创建了一个对象");
}
}
class Program
{
static void Main(string[] args)
{
Singleton s = Singleton.Instance;
//Singleton s = new Singleton(); 错误使用,因为构造器是私有的
Console.WriteLine(Singleton.Num);
/* 验证的确是只生成了一个实例
Singleton ss = Singleton.Instance;
Console.WriteLine(Singleton.Num);
*/
}
}
}
2.用lock考虑多线程:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GofSingleton
{
//用volatile加锁的方式实现多线程下的Singtelon模式
class DoubleCheckSingleton
{
private static volatile DoubleCheckSingleton instance = null;
private static object lockHelp = new object();
public static DoubleCheckSingleton Instance
{
get
{
if (instance == null)
{
lock (lockHelp)
{
if (instance == null)
{
instance = new DoubleCheckSingleton();
}
}
}
return instance;
}
}
private DoubleCheckSingleton()
{
Console.WriteLine("在多线程模式下实现Singtelon模式");
}
}
class Test
{
static void Main(string[] args)
{
DoubleCheckSingleton dcs = DoubleCheckSingleton.Instance;
}
}
}