晓得本人不能做什么远比晓得本人能做什么重要。

单例模式介绍:

单例模式(Singleton),也叫单子模式,是一种罕用的软件设计模式。在利用这个模式时,单例对象的类必须保障只有一个实例存在。许多时候整个零碎只须要领有一个全局对象,这样有利于咱们协调系统整体的行为。

比方在某个服务器程序中,该服务器的配置信息寄存在一个文件中,这些配置数据由一个单例对象对立读取,而后服务过程中的其余对象再通过这个单例对象获取这些配置信息。这种形式简化了在简单环境下的配置管理。

单例模式实现思路:

  • 一个类能返回对象一个援用(永远是同一个)和一个取得该实例的办法(必须是静态方法,通常应用getInstance这个名称);
  • 调用这个办法时,如果类持有的援用不为空就返回这个援用,如果类放弃的援用为空就创立该类的实例并将实例的援用赋予该类放弃的援用;
  • 将该类的构造函数定义为公有办法,这样其余处的代码就无奈通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来失去该类的惟一实例。

须要留神的中央:

单例模式在多线程的,利用场合下必须小心应用。如果当惟一实例尚未创立时,有两个线程同时调用创立办法,那么它们同时没有检测到惟一实例的存在,从而同时各自创立了一个实例,这样就有两个实例被结构进去,从而违反了单例模式中实例惟一的准则。

解决这个问题的方法是为批示类是否曾经实例化的变量提供一个互斥锁(尽管这样会升高效率)。

长处:

  1. 在单例模式中,流动的单例只有一个实例,对单例类的所有实例化失去的都是雷同的一个实例。这样就 避免其它对象对本人的实例化,确保所有的对象都拜访一个实例
  2. 单例模式具备肯定的伸缩性,类本人来管制实例化过程,类就在扭转实例化过程上有相应的伸缩性。
  3. 提供了对惟一实例的受控拜访。
  4. 因为在零碎内存中只存在一个对象,因而能够 节约系统资源,当 须要频繁创立和销毁的对象时单例模式无疑能够进步零碎的性能。
  5. 容许可变数目标实例。
  6. 防止对共享资源的多重占用。

毛病:

  1. 不适用于变动的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的谬误,不能保留彼此的状态。
  2. 因为单利模式中没有形象层,因而单例类的扩大有很大的艰难。
  3. 单例类的职责过重,在肯定水平上违反了“繁多职责准则”。
  4. 滥用单例将带来一些负面问题,如为了节俭资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而呈现连接池溢出;如果实例化的对象长时间不被利用,零碎会认为是垃圾而被回收,这将导致对象状态的失落。

应用注意事项:

  1. 应用时不能用反射模式创立单例,否则会实例化一个新的对象
  2. 应用懒单例模式时留神线程平安问题
  3. 饿单例模式和懒单例模式构造方法都是公有的,因而是不能被继承的,有些单例模式能够被继承(如注销式模式)

实用场景:

单例模式只容许创立一个对象,因而节俭内存,放慢对象访问速度,因而对象须要被专用的场合适宜应用,如多个模块应用同一个数据源连贯对象等等。如:

  • 须要频繁实例化而后销毁的对象。
  • 创建对象时耗时过多或者耗资源过多,但又常常用到的对象。
  • 有状态的工具类对象。
    -频繁拜访数据库或文件的对象。

以下都是单例模式的经典应用场景:

  1. 资源共享的状况下,防止因为资源操作时导致的性能或损耗等。如上述中的日志文件,利用配置。
  2. 管制资源的状况下,不便资源之间的相互通信。如线程池等。

利用场景:

1.内部资源,每台计算机有若干个打印机,但只能有一个PrinterSpooler,以防止两个打印作业同时输入到打印机。外部资源:大多数软件都有一个(或多个)属性文件寄存系统配置,这样的零碎应该有一个对象治理这些属性文件

2.Windows的Task Manager(工作管理器)就是很典型的单例模式(这个很相熟吧),想想看,是不是呢,你能关上两个windows task manager吗?不信你本人试试看哦~

3.windows的Recycle Bin(回收站)也是典型的单例利用。在整个零碎运行过程中,回收站始终保护着仅有的一个实例。

4.网站的计数器,个别也是采纳单例模式实现,否则难以同步。

5.应用程序的日志利用,个别都何用单例模式实现,这个别是因为共享的日志文件始终处于关上状态,因为只能有一个实例去操作,否则内容不好追加。

6.Web利用的配置对象的读取,个别也利用单例模式,这个是因为配置文件是共享的资源。

7.数据库连接池的设计个别也是采纳单例模式,因为数据库连贯是一种数据库资源。数据库软件系统中应用数据库连接池,次要是节俭关上或者敞开数据库连贯所引起的效率损耗,这种效率上的损耗还是十分低廉的,因为何用单例模式来保护,就能够大大降低这种损耗。

8.多线程的线程池的设计个别也是采纳单例模式,这是因为线程池要不便对池中的线程进行管制。

9.操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。

10.HttpApplication 也是单位例的典型利用。相熟ASP.Net(IIS)的整个申请生命周期的人应该晓得HttpApplication也是单例模式,所有的HttpModule都共享一个HttpApplication实例.