大战设计模式【7】—— 单例模式

单例模式(Singleton)

 

设计模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample

 

一、定义

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
单例模式是一种对象创建模式。



二、结构

Singleton(单例);



 

三、优点

提供了对唯一实例的受控访问。单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它。
由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象,单例模式无疑可以提高系统的性能。
允许可变数目的示例。基于单例模式,开发人员可以进行扩展,使用与控制单例对象相似的方法来获得指定个数的实例对象,既节省系统资源,又解决了单例对象共享过多有损性能的问题。



 

四、缺点

单例模式中没有抽象层,因此单例类的扩展有很大的困难。
单例类的职责过重,在一定程度上违背了单一职责的原则。



 

五、应用场景

系统只需要一个实例对象。例如:系统要求提供一个唯一的序列号生成器或者资源管理器,又或者需要考虑资源消耗太大而只允许创建一个对象。
客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例。



六、个人总结

1、单例模式应用场景非常的多,对它最直接简单的描述就是:全局唯一。
2、单例模式要保证的点:
无论是多少个线程还是多少人访问,获得的对象都是同一个。
同时必须考虑性能和存储
3、实现单例模式的基本步骤
私有化变量
私有化构造方法
提供公开的获取变量的方法
4、实现单例模式的代码有很多种,这里举例最常见的三种,也就是例子中描述的三种
饿汉式(eager):直接静态初始化变量,适用于访问量平凡(饥饿)
懒加载(lazyLoad):获取对象时才初始化对象,并且用同步约束获取对象的方法,适用于访问量很少但是需要使用单例的情况
双重检查加锁(double-checked locking):只有第一次才进行同步检查,大大减少了getInstance的时间


 
参考博客:http://www.cnblogs.com/edisonchou/p/6618503.html
原文地址:https://www.cnblogs.com/linkstar/p/7686957.html