单例模式
前言
单例模式应该是所有接触的设计模式初学者第一个听过的设计模式,这个模式应该是所有设计模式中最简单的一个模式了。值得注意的是,许多开发者将单例模式视为一种反模式,因此单例模式在 Python 中的使用频率现在越来越少了。<br />
反模式(英文:Anti-patterns或pitfalls), 是指用来解决问题的带有共同性的不良方法。它们已经经过研究并分类,以防止日后重蹈覆辙,并能在研发尚未投产时辨认出来。软件开发中公认的反模式
意图
保证一个类仅有一个实例,并提供一个访问它的全剧访问点。
UML 图
简单看一下单例模式的 UML 图
应用场景
单例模式最常使用的场景就是连接数据库以及日志等等,单例模式使用的场景通常有以下几个特点
需要频繁实例化然后销毁的对象。
创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
有状态的工具类对象。
频繁访问数据库或文件的对象。
代码
接下来让我们通过代码实现一个单例模式
简单单例模式
看一下输出:
线程安全单例模式
上面的单例模式可能会在多线程环境中出错,所以为了解决这个问题,我们将单例模式再升级一下<br />
看一下输出结果:
总结
单例模式优缺点
优点
你可以保证一个类只有一个实例。
你获得了一个指向该实例的全局访问节点。
仅在首次请求单例对象时对其进行初始化。
缺点
违反了单一职责原则。
单例模式可能掩盖不良设计, 可能会隐藏类之间的依赖关系。
该模式在多线程环境下需要进行特殊处理, 避免多个线程多次创建单例对象。
单例的客户端代码单元测试可能会比较困难, 因为许多测试框架以基于继承的方式创建模拟对象。 由于单例类的构造函数是私有的, 而且绝大部分语言无法重写静态方法。
单例不支持有参数的构造函数,比如我们创建一个连接池的单例对象,我们没法通过参数来指定连接池的大小。
版权声明: 本文为 InfoQ 作者【Leetao】的原创文章。
原文链接:【http://xie.infoq.cn/article/44036463cdf900bc81417684e】。文章转载请联系作者。
评论