定义
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
单例模式是一种对象创建型模式。
单例模式有3个要点:
- 一是某个类只能有一个实例;
- 二是它必须自行创建这个实例;
- 三是它必须自行向整个系统提供这个实例。
结构
实现
单例模式的目的是保证一个类有且仅有一个实例,并提供一个访问它的全局访问点。单例模式包含的角色只有一个,就是单例类----Singleton。单例类拥有一个私有构造函数﹐确保用户无法通过new关键字直接实例化它。除此之外,单例类中还包含一个静态私有成员变量与静态公有的工厂方法﹐该工厂方法负责检验实例的存在性并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。
class Singleton
{
private static Singleton instance = null; //静态私有成员变量
//私有构造函数
private Singleton()
{
}
//静态公有工厂方法,返回唯一实例
public static Singleton GetInstance()
{
if (instance == null)
instance = new Singleton();
return instance;
}
}
class Program
{
static void Main(string[] args)
{
Singleton s = Singleton.GetInstance();
}
}
在单例模式的实现过程中,需要注意以下三点:
- (1)单例类构造函数的可见性为private。
- (2)提供一个类型为自身的静态私有成员变量。
- (3)提供一个公有的静态工厂方法。
优点
- (1)单例模式提供了对唯一实例的受控访问。
- (2)节约资源,无需频繁创建和销毁
- (3)单例模式允许可变数目的实例。
缺点
- (1)由于单例模式中没有抽象层,因此,单例类的扩展有很大的困难。
- (2)单例类的职责过重,在一定程度上违背了单一职责原则。
- (3)在一些面向对象语言中,长久未利用会被销毁,导致单例对象丢失
适用环境
- (1)系统只需要一个实例对象,例如系统要求提供一个唯一的序列号生成器或资源管理器,或者因为资源消耗太大而只允许创建一个对象。
- (2)用户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例。