辛格尔顿(Singleton Pattern):Singleton模式保证一个类只有一个实例,和自我实例化整个系统的一个实例,并提供,这个类被称为单例类。它提供全球接入方式。
单例模式的要点有三个:一是某个类仅仅能有一个实例。二是它必须自行创建这个实例。三是它必须自行向整个系统提供这个实例。
单例模式是一种对象创建型模式。
单例模式又名单件模式或单态模式。
2、模式结构
单例模式包括例如以下角色:
Singleton:单例
3、模式分析
单例模式的目的是保证一个类仅有一个实例,并提供一个訪问它的全局訪问点。单例模式包括的角色仅仅有一个,就是单例类——Singleton。单例类拥有一个私有构造函数,确保用户无法通过newkeyword直接实例化它。
除此之外,该模式中包括一个静态私有成员变量与静态公有的工厂方法,该工厂方法负责检验实例的存在性并实例化自己。然后存储在静态成员变量中。以确保仅仅有一个实例被创建。
public class Singleton
{
private static Singleton instance=null; //静态私有成员变量
//私有构造函数
private Singleton()
{
}
//静态公有工厂方法,返回唯一实例
public static Singleton getInstance()
{
if(instance==null)
instance=new Singleton();
return instance;
}
}
在单例模式的实现过程中,须要注意例如以下三点:
单例类的构造函数为私有。
提供一个自身的静态私有成员变量;
提供一个公有的静态工厂方法。
4、模式优缺点
单例模式的长处
提供了对唯一实例的受控訪问。由于单例类封装了它的唯一实例,所以它能够严格控制客户如何以及何时訪问它,并为设计及开发团队提供了共享的概念。
因为在系统内存中仅仅存在一个对象。因此能够节约系统资源,对于一些须要频繁创建和销毁的对象,单例模式无疑能够提高系统的性能。
同意可变数目的实例。我们能够基于单例模式进行扩展,使用与单例控制相似的方法来获得指定个数的对象实例。
单例模式的缺点
因为单例模式中没有抽象层。因此单例类的扩展有非常大的困难。
单例类的职责过重,在一定程度上违背了“单一职责原则”。由于单例类既充当了工厂角色,提供了工厂方法,同一时候又充当了产品角色。包括一些业务方法,将产品的创建和产品的本身的功能融合到一起。
滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如今非常多面向对象语言(如Java、C#)的执行环境都提供了自己主动垃圾回收的技术。因此,假设实例化的对象长时间不被利用,系统会觉得它是垃圾。会自己主动销毁并回收资源,下次利用时又将又一次实例化,这将导致对象状态的丢失。
5、模式适用环境
在下面情况下能够使用单例模式:
系统仅仅须要一个实例对象,如系统要求提供一个唯一的序列号生成器。或者须要考虑资源消耗太大而仅仅同意创建一个对象。
客户调用类的单个实例仅仅同意使用一个公共訪问点,除了该公共訪问点。不能通过其它途径訪问该实例。
在一个系统中要求一个类仅仅有一个实例时才应当使用单例模式。反过来,假设一有一类的几个实例可以共存,对需要改进的Singleton模式,使之更案例模式。