【设计模式】Singleton模式C++实现
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
【设计模式】Singleton模式C++实现的更多相关文章
- 1.设计模式 - Singleton模式(单件模式)
Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点,一般用于Activity的控制层全局对象和Singl ...
- c++11 改进设计模式 Singleton模式
关于学习 <深入应用c++11>的代码笔记: c++11之前是这么实现的 template<typename T> class Singleton{ public: stati ...
- 单例设计模式Singleton之懒加载模式(懒汉模式)【原】
单例设计模式Singleton之懒加载模式(懒汉模式) SingletonLazy.java类 package kingtool; import kingtool.http.IPTool; publi ...
- Java设计模式(2)单态模式(Singleton模式)
定义:Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作. 还有,singleton能够被状态化 ...
- 设计模式(五)Singleton模式
Singleton模式就是确保只生成一个实例的模式.这里有两个意思,即想确保任何情况下都绝对只有一个实例和想在程序上表现出“只存在一个实例”. 下面通过一个实例来说明这种设计模式. package B ...
- 2)Javascript设计模式:Singleton模式
Singleton模式 var User = (function() { var instance; function _User(){} _User.prototype.say = function ...
- 设计模式之Singleton模式和Strategy模式是什么
Singleton模式 单例模式,也交单子模式,有时候系统只需要拥有一个全局对象. 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问其唯一的对象的方 ...
- 设计模式之Singleton模式
当程序运行时,有时会希望在程序中,只能存在一个实例,为了达到目的,所以设计了Singleton模式,即单例模式. 单例模式的特征: 想确保任何情况下只存在一个实例 想在程序上表现出只存在一个实例 示例 ...
- 设计模式 - 单件模式(singleton pattern) 具体解释
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/28595349 单件模式(singleton ...
随机推荐
- 使用gettimeofday测试函数运行的时间
#include <time.h> #include <stdio.h> #include<sys/time.h> #define NEW_TIME_VALE st ...
- 旧版本mysql下载大全,爽~~
http://mirror.cogentco.com/pub/mysql/MySQL-4.1/ http://mirror.cogentco.com/pub/mysql/MySQL-5.0/ http ...
- ZYSocket 4.3.5 SOCKET框架组 发布[NEW]
最新代码请到 github: https://github.com/luyikk/ZYSOCKET 更新 4.3.5更新说明: 修复各种BUG. 重写了一份 protobuf-net 有什么用呢,不需 ...
- php Smarty模板引擎配置与测试
Smarty简介 smarty是一个使用PHP写出来的模板PHP模板引擎,它提供了逻辑与外在内容的分离,简单的讲,目的就是要使用PHP程序员同美工分离,使用的程序员改变程序的逻辑内容不会影响到美工的页 ...
- 高级特性(7)- 高级AWT
7.1 绘图操作流程7.2 形状7.3 区域7.4 笔划7.5 着色7.6 坐标变换7.7 剪切7.8 透明与组合7.9 绘图提示7.10 图像的读取器和写入器 7.10.1 获得图像文件类型的读取器 ...
- HTML——左右側边栏布局
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- JS实现图片翻书效果
picture.html <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http- ...
- VS2008下直接安装使用Boost库1.46.1版本
Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容.在C++ ...
- Android ble 蓝牙4.0 总结
本文介绍Android ble 蓝牙4.0,也就是说API level >= 18,且支持蓝牙4.0的手机才可以使用,如果手机系统版本API level < 18,也是用不了蓝牙4.0的哦 ...
- ASP.NET - 后台获取按钮绑定的值CommandArgument
<asp:LinkButton runat="server" ID="resumelbtn" CommandArgument='<%# Eval(& ...