博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式】Singleton模式C++实现
阅读量:5880 次
发布时间:2019-06-19

本文共 1672 字,大约阅读时间需要 5 分钟。

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 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

你可能感兴趣的文章
HTML5通信机制与html5地理信息定位(gps)
查看>>
Mind_Manager_2
查看>>
手动升级 Confluence - 规划你的升级
查看>>
汽车常识全面介绍 - 悬挂系统
查看>>
电子政务方向:We7.Cloud政府云门户
查看>>
虚拟机Centos7连接Internet
查看>>
ansible 基本操作(初试)
查看>>
更改tomcat的根目录路径
查看>>
51nod 1292 字符串中的最大值V2(后缀自动机)
查看>>
加快ALTER TABLE 操作速度
查看>>
学习笔记之软考数据库系统工程师教程(第一版)
查看>>
基本网络概念
查看>>
将 ASP.NET Core 2.0 项目升级至 ASP.NET Core 2.1 RC 1
查看>>
js提交图片转换为base64
查看>>
学习CodeIgniter框架之旅(二)继承自定义类
查看>>
Y2161 Hibernate第三次考试 2016年8月18日 试卷分析
查看>>
Angular CLI 使用教程指南参考
查看>>
PHP 程序员的技术成长规划
查看>>
用于守护进程的出错处理函数
查看>>
memcached 分布式聚类算法
查看>>