单例模式的意思就是只有一个实例
单例模式确保某一个类只有一个实例
而且自行实例化并向整个系统提供这个实例
这个类称为单例类每台计算机可以有若干个打印机
但只能有一个Printer Spooler
以避免两个打印作业同时输出到打印机中
每台计算机可以有若干传真卡
但是只应该有一个软件负责管理传真卡
以避免出现两份传真作业同时传到传真卡中的情 况
每台计算机可以有若干通信端口
系统应当集中管理这些通信端口
以避免一个通信端口同时被两个请求同时调用
问题描述
单例模式 Singleton Pattern
问题解决
()单例模式简介
Singleton模式要求一个类有且仅有一个实例并且提供了一个全局的访问点这就提出了一个问题如何绕过常规的构造器提供一种机制来保证 一个类只有一个实例?客户程序在调用某一个类时它是不会考虑这个类是否只能有一个实例等问题的所以这应该是类设计者的责任而不是类使用者的责任
单例模式特点
()一个类有且仅有一个实例
()类提供一个全局的访问点
()单例模式的实现
()简单实现
上述实现的优点
()直到对象要求时才进行实例的初始化这种实现方法称为“惰性实例化”惰性实例化避免了程序启动时创建不必要的Singleton
上述实现的缺点
()这种实现对于多线程环境并不安全可能实例化多个对象例如可能存在两个线程进行instance==null的判断然后创建两个单例对象这就违背了单例模式的设计意图
()安全的线程
以上的实现保证了单例对象在多线程的情况下只会创建一个但是padlock增加了额外的开销
()双重锁定
这种实现方式对多线程来说是安全的同时线程不是每次都加锁只有判断对象实例没有被创建时它才加锁有了我们上面第一部分的里面的分析我们知道加锁 后还得再进行对象是否已被创建的判断它解决了线程并发问题同时避免在获取 Instance 的调用中都出现独占锁定它还允许您将实例化延迟到第一次访问对象时发生实际上应用程序很少需要这种类型的实现大多数情况下我们会用静态初始化这 种方式仍然有很多缺点无法实现延迟初始化
()静态初始化
此实现中将在第一次引用类的任何成员创建实例该类标记为 sealed 以阻止发生派生而派生可能会增加实例此外变量标记为 readonly这意味着只能在静态初始化期间(此处显示的示例)或在类构造函数中分配变量它仍然可以用来解决 Singleton 模式试图解决的两个基本问题全局访问和实例化控制公共静态属性为访问实例提供了一个全局访问点此外由于构造函数是私有的因此不能在类本身以外实 例化 Singleton 类因此变量引用的是可以在系统中存在的唯一的实例
由于 Singleton 实例被私有静态成员变量引用因此在类首次被对 Instance 属性的调用所引用之前不会发生实例化这种方法唯一的潜在缺点是您对实例化机制的控制权较少在 Design Patterns 形式中您能够在实例化之前使用非默认的构造函数或执行其他任务由于在此解决方案中由 NET Framework 负责执行初始化因此您没有这些选项在大多数情况下静态初始化是在 NET 中实现 Singleton 的首选方法
()延迟初始化
()单例模式的优缺点
()单例模式适用情况和应用场景
()具体实例
总结
Singleton设计模式是一个非常有用的机制可用于在面向对象的应用程序中提供单个访问点