在使用某个设计模式之前必需先了解使用它的长处:
1、单例模式就是保证在整个应用措施的生命周期中,在任何时刻,被指定的类只有一个实例东西,减少了东西的创建,从而减轻了措施内存的开销。
2、单例模式是一种常用的软件设计模式。在它的核心布局中只包罗一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访谒,从而便利对实例个数的控制并节约系统资源。如果但愿在系统中某个类的东西只能存在一个,单例模式是最好的解决方案。
3、说白了就是保证一个类仅有一个实例,并供给一个该实例的全局访谒点。
应用场景:
1. Windows的Task Manager(任务打点器)就是很范例的单例模式,任何时候只能打开一个窗口。
2. windows的Recycle Bin(回收站)也是范例的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
3. 网站的计数器,一般也是给与单例模式实现,否则难以同步。
4. 应用措施的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操纵,否则内容欠好追加。
5. Web应用的配置东西的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。
6. 数据库连接池的设计一般也是给与单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者*数据库连接所引起的效率损耗,这种效率上的损耗还长短常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。
7. 多线程的线程池的设计一般也是给与单例模式,这是由于线程池要便利对池中的线程进行控制。
8. 操纵系统的文件系统,也是大的单例模式实现的具编制子,一个操纵系统只能有一个文件系统。
代码实现(懒汉模式:在第一次被引用时将本身实例化):
1.将该类的结构要领界说为私有要领,这样其他处的代码就无法通过挪用该类的结构要领来实例化该类的东西,只有通过该类供给的静态要领来得到该类的独一实例;(防备挪用者直接实例化)
2.在该类内供给一个静态要领,当我们挪用这个要领时,如果类持有的引用不为空就返回这个引用,如果类连结的引用为空就创建该类的实例并将实例的引用赋予该类连结的引用。
3.创建访谒者东西(用于加锁防备并发)
4.创建全局访谒点(输出实例):所以该要领绝对不能是 private、protected不然其他类无法挪用该要领,并且必需是静态的要领因为 本类结构函数为
私有的外部无法实例化本类(前面已经讲了),所以只能通过 类名 .(点) 要领名来挪用该要领。不然你在创建的这个类就是废类别人无法使用
使用双重锁来防备多线程挪用呈现的并发问题:
当Single为null并且同时有两个线程挪用
GetInstance要领时,他们将都可以通过第
一重Single==null的判断,然后由于lock
机制,这两个线程则只有一个进入,另一
个在外排队等待,必需要此中的一个进入
并出来后,另一个才华进入。而此时如果
没有了第二重的Single是否为null的判断,
则第一个线程创建了实例,而第二个线程
还是可以继续在创建新的实例,这就没有
到达单例的目的。
5.挪用
(饿汉模式:加载时就将本身实例化)
注意:此时处事东西已经在措施加载时赋值为该类实例(但是只赋值一次,因为 static readonly是使用静态结构函数赋值)