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. 1.设计模式 - Singleton模式(单件模式)

    Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点,一般用于Activity的控制层全局对象和Singl ...

  2. c++11 改进设计模式 Singleton模式

    关于学习 <深入应用c++11>的代码笔记: c++11之前是这么实现的 template<typename T> class Singleton{ public: stati ...

  3. 单例设计模式Singleton之懒加载模式(懒汉模式)【原】

    单例设计模式Singleton之懒加载模式(懒汉模式) SingletonLazy.java类 package kingtool; import kingtool.http.IPTool; publi ...

  4. Java设计模式(2)单态模式(Singleton模式)

    定义:Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作. 还有,singleton能够被状态化 ...

  5. 设计模式(五)Singleton模式

    Singleton模式就是确保只生成一个实例的模式.这里有两个意思,即想确保任何情况下都绝对只有一个实例和想在程序上表现出“只存在一个实例”. 下面通过一个实例来说明这种设计模式. package B ...

  6. 2)Javascript设计模式:Singleton模式

    Singleton模式 var User = (function() { var instance; function _User(){} _User.prototype.say = function ...

  7. 设计模式之Singleton模式和Strategy模式是什么

    Singleton模式 单例模式,也交单子模式,有时候系统只需要拥有一个全局对象. 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问其唯一的对象的方 ...

  8. 设计模式之Singleton模式

    当程序运行时,有时会希望在程序中,只能存在一个实例,为了达到目的,所以设计了Singleton模式,即单例模式. 单例模式的特征: 想确保任何情况下只存在一个实例 想在程序上表现出只存在一个实例 示例 ...

  9. 设计模式 - 单件模式(singleton pattern) 具体解释

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/28595349 单件模式(singleton ...

随机推荐

  1. 使用gettimeofday测试函数运行的时间

    #include <time.h> #include <stdio.h> #include<sys/time.h> #define NEW_TIME_VALE st ...

  2. 旧版本mysql下载大全,爽~~

    http://mirror.cogentco.com/pub/mysql/MySQL-4.1/ http://mirror.cogentco.com/pub/mysql/MySQL-5.0/ http ...

  3. ZYSocket 4.3.5 SOCKET框架组 发布[NEW]

    最新代码请到 github: https://github.com/luyikk/ZYSOCKET 更新 4.3.5更新说明: 修复各种BUG. 重写了一份 protobuf-net 有什么用呢,不需 ...

  4. php Smarty模板引擎配置与测试

    Smarty简介 smarty是一个使用PHP写出来的模板PHP模板引擎,它提供了逻辑与外在内容的分离,简单的讲,目的就是要使用PHP程序员同美工分离,使用的程序员改变程序的逻辑内容不会影响到美工的页 ...

  5. 高级特性(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 获得图像文件类型的读取器 ...

  6. HTML——左右側边栏布局

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  7. JS实现图片翻书效果

    picture.html <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http- ...

  8. VS2008下直接安装使用Boost库1.46.1版本

    Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容.在C++ ...

  9. Android ble 蓝牙4.0 总结

    本文介绍Android ble 蓝牙4.0,也就是说API level >= 18,且支持蓝牙4.0的手机才可以使用,如果手机系统版本API level < 18,也是用不了蓝牙4.0的哦 ...

  10. ASP.NET - 后台获取按钮绑定的值CommandArgument

    <asp:LinkButton runat="server" ID="resumelbtn" CommandArgument='<%# Eval(& ...