想想一下这个场景,一个系统中可以存在多个打印任务,但是只有一个正在工作的任务。我们怎样才能保证一个类只有一个实例并且这个实例易于被访问呢?一个全局变量可以使得一个对象可以被访问,但是不能防止实例化多个对象。
一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个方位该实例的方法,这就是单例模式的动机。
单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个 系统提供这个实例,这个类称为单例类,它提供全局访问的方法 。单例模式又名单件模式或单态模式。
单例模式的要点:
此模式太简单,没有图。
单例模式包含如下角色:
优点:
缺点:
在以下情况下可以使用抽象工厂模式:
Singleton_Uml
#ifndef SINGLETON_H
#define SINGLETON_H
#include <iostream>
using namespace std;
class Singleton
{
protected:
Singleton();
public:
static Singleton* Instance();
private:
static Singleton* _instance;
};
#endif // SINGLETON_H
#include "singleton.h"
#include <iostream>
using namespace std;
Singleton* Singleton::_instance = 0;
Singleton::Singleton()
{
cout << "==> Singleton." << endl;
}
Singleton* Singleton::Instance()
{
if (_instance == 0)
{
_instance = new Singleton();
}
return _instance;
}
#include "singleton.h"
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
Singleton* singleton1 = Singleton::Instance();
Singleton* singleton2 = Singleton::Instance();
if (singleton1 == singleton2)
cout << "They equal." << endl;
return 0;
}
运行结果:
==> Singleton.
They equal.
代码说明:
客户仅通过 Instance() 成员函数访问这个单例。变量 _instance 初始化为0,而静态成员函数 Instance() 使用惰性初始化;它的返回值直到被第一次访问时才创建和保存。
注意构造器是保护型的。试图直接实例化 Singleton 的客户将得到一个编译时的错误信息。 这就保证了仅有一个实例可以被创建。 比如,我们使用如下代码实例化:
Singleton* singleton = new Singleton();
编译器会报出如下错误:
E:\Programming\Design Patterns\Code\C++\04_Singleton\singleton.h:10: error: 'Singleton::Singleton()' is protected
Singleton();
^
#-*- coding: utf-8 -*-
'''
单例模式
'''
class Singleton(object):
_instance = None
def __new__(cls, *args, **kw):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)
print('==>Singleton')
return cls._instance
def main():
singleton1 = Singleton()
singleton2 = Singleton()
print(singleton1 is singleton2)
if __name__ == '__main__':
main()
运行结果:
==>Singleton
True
代码分析:
在上面的代码中,我们将类的实例和一个类变量 _instance
关联起来,如果 cls._instance
为 None 则创建实例,否则直接返回 cls._instance
。最后print(singleton1 is singleton2)
结果为Ture,说明singleton1与singleton2为同一实例。
系列推荐阅读:
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有