【设计模式】Singleton模式C++实现
来源:互联网 发布:python怎么使用wget 编辑:程序博客网 时间:2024/06/05 05:07
Singleton是设计模式中比较简单的一个。园中的朋友们应该都很熟悉了。前段时间参加xxx外企的面试,和面试官讨论C++的时候正好写了一个。当时由于在有些地方考虑不太周全,代码出现了一些疏漏。不过最终写出了合格的实现。
Singleton模式
要求:
1、保证类只有一个实例
2、实例只能由类自身构造
3、必须为其他所有对象提供这一对象以访问。
由此,我们画出Singleton模式的结构图如下:
根据要求,类实例只能由自身构造,因此必须要控制构造函数(默认构造函数和拷贝构造函数)的访问权限(这里不考虑继承的问题)。
class Singleton{ private: Singleton(); Singleton(Singleton &t); };
第一条,要求类只能有一个实例,因此必须防止客户出现拷贝或者复制的情况。
class Singleton{ private: Singleton(); Singleton(Singleton &t); Singleton& operator= (Singleton &rhs);};
最终实现如下:
class Singleton{ public: Singleton *Instance(); private: static Singleton *instance; Singleton(); Singleton(Singleton &t); Singleton& operator =(Singleton& rhs);};Singleton* Singleton::instance = null;Singleton* Singleton::Instance{ if(instance == null){ instance = new Singleton(); } return instance;}
在上面的代码中,客户需要通过下面的方式取得单例对象
Singleton *ps = Singleton::Instance();
因为函数返回了一个对象的指针,如果客户失误调用delete操作符,则很容易出现错误甚至程序崩溃。因此可以修改Singleton::Instance()的实现:
class Singleton{ public: Singleton *Instance(); private: Singleton(); Singleton(Singleton &t); Singleton& operator =(Singleton& rhs);};Singleton* Singleton::Instance{ static Singleton instance; return &instance;}
这样更加安全,也体现了延迟创建的原则。
多态的实现
比较简单而且好用的方法是使用模板。
template<class T>class Singleton{ public: T* Instance(){ static T t; return &t; } private: Singleton(); Singleton(Singleton&); Singleton& operator=(Singleton&);};
在定义C++类时,编译器会为我们自动创建一些函数(构造,析构,赋值操作符等),并且默认访问权限为public,如果不希望客户调用它,应该明确避免使用默认的实现,手动定义并限制其访问权限(Effective C++中的设计原则),在这个例子中得到了非常好的应用。
>>>>>>>>>>>>>>>>>>>>>>>>>>
2013-06-17 14:33:34
- 【C++】实现Singleton模式
- Singleton设计模式(C++)
- C#实现Singleton设计模式
- C++实现Singleton设计模式
- singleton设计模式,c++实现
- 【设计模式】Singleton模式C++实现
- 设计模式-----Singleton模式
- 设计模式-Singleton模式
- 设计模式--Singleton模式
- 设计模式-------Singleton模式
- 设计模式--singleton模式
- 设计模式--Singleton模式
- 【设计模式】--SINGLETON模式
- 常见设计模式的解析和实现(C++)之五-Singleton模式
- 常见设计模式的解析和实现(C++)之五-Singleton模式
- 设计模式解析和实现(C++, java)之十-singleton模式
- 常见设计模式的解析和实现(C++)之五-Singleton模式
- 常见设计模式的解析和实现(C++)之五-Singleton模式
- RedHat 5.5 使用CentOS YUM源更新的方法
- C++内存管理学习笔记(5)
- 使用Understand获取某个函数(方法)的静态度量指标
- error: device offline- waiting for device
- Java 得到文件行数
- 【设计模式】Singleton模式C++实现
- FC HBA卡信息的方法
- Proc*C实例一 -- 连接数据库
- 鼠标冒泡
- js 日历
- Android:单元测试Junit配置
- [三维图像处理]Chapter 3 Local processing of 3D images
- 算法复杂度分析之主方法 Master Method
- createAudioHardware的流程