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   13:50:34

 

Singleton模式C++实现的更多相关文章

  1. Qt 中使用Singleton模式需小心

    在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...

  2. 剑指Offer面试题:1.实现Singleton模式

    说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...

  3. C++ Singleton模式

    地址:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html Singleton模式是常用的设计模式之一,但是要实现一个真正实用的设计模式却 ...

  4. Singleton模式——对象创建型模式

    Singleton模式即为单例模式/单件模式. (一)意图--保证一个类仅有一个实例,并提供一个访问它的全局访问点. 如一台计算机可以有多个端口,但是应该统一管理这些端口,避免访问冲突.--选择Sin ...

  5. Singleton模式和Mono-State模式

    类和实例 对于大多数的类,都可以创建多个实例.在需要和不需要时,创建和删除这些实例.该过程会伴随着内存的分配和归还. 同时,有一些类,应该仅有一个实例.该实例在程序启动/结束时被创建和删除. root ...

  6. 转:Singleton模式

    C++完美实现Singleton模式  转自:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html boost库的Singleton的实现 ...

  7. Singleton模式

    Singleton模式的特点: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 定义一个Instance操作,允许客户访问它的唯一实例.Instance是一个类操作(C++中的一个静态成员函数 ...

  8. Objective-C的singleton模式

    最近因为在ios应用开发中,考虑到一些公共方法的封装使用,就决定使用单例模式的写法了..不知道,Object-c中的单例模式的写法是否和java中的写法是否有所区别?于是阿堂从网上一搜,发现“ Obj ...

  9. js中singleton模式解析及运用

    singleton模式,又名单例模式.顾名思义,就是只能实例化一次的类(javascript中没有真正的类,我们通常用函数来模拟类,习惯称之为"伪类").具体地说,singleto ...

  10. Singleton 模式

    个人认为 Singleton 模式是设计模式中最为简单.最为常见.最容易实现,也是最应该熟悉和掌握的模式.且不说公司企业在招聘的时候为了考察员工对设计的了解和把握,考的最多的就是 Singleton ...

随机推荐

  1. Webbrowser代理支持

    原文:Webbrowser代理支持 1 通过设置注册表,再用InternetSetOption发送INTERNET_OPTION_SETTINGS_CHANGED与INTERNET_OPTION_RE ...

  2. 2014Esri国际用户大会ArcGIS Online

    1.基于什么是新的ArcGISOnline? ArcGISOnline不断更新.大约每四个月就会把新的增强的功能公布到各部分中.有新的空间分析的应用程序,如 Explorer forArcGIS,ap ...

  3. 如何去除configure的默认选择-g O2

    http://lists.gnu.org/archive/html/autoconf/2006-04/msg00002.html http://www.linuxidc.com/Linux/2013- ...

  4. CentOS上部署Apache、MySQL和PHP

    centos上yum安装很方便,下面介绍编译安装的方式. 第一步要在CentOS上安装gcc.g++等开发工具 可以从系统光盘上安装,或者 #yum groupinstall "Develo ...

  5. MySQL之自定义函数

    引言 MySQL本身提供了内置函数,这些函数的存在给我们日常的开发和数据操作带来了很大的便利,比如我前面提到过的聚合函数SUM().AVG()以及日期时间函数等等,可是我们总会出现其他的需求:我们需要 ...

  6. jquery 拖动DIV

    <html><head> <style type="text/css"> .show{ background:#7cd2f8; width:30 ...

  7. css技巧--整理(1)

    1.文字描边 -webkit-text-shadow:#be8ef8 2px 0 1px,#be8ef8 0 2px 1px,#be8ef8 -2px 0 1px,#be8ef8 0 -2px 1px ...

  8. JSON.stringify 方法

    浅谈 JSON.stringify 方法   用过 json 的应该都知道,把一个对象通过 stringify 之后提交给后台或者存储在 Storage 里是很常用的手段.但是 IE6-8 下没有 J ...

  9. javascript 类型检测

    javascript数据类型分为简单数据类型和复杂数据类型.简单数据类型分为string,number,boolean,defined,null,复杂数据类型为Object.类型检测在写代码可能会非常 ...

  10. [转]当图片源大小大于ImageView大小时的处理方式(缩放)

    转一篇当图片源大小大于ImageView大小定死时的处理方法,但不适用于图片大小小于ImageView时的情况,因为inSampleSize不能<1, 谁有特别好的放大的解决方案,除了设置Ima ...