博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式——单例模式 (C++实现)
阅读量:4837 次
发布时间:2019-06-11

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

单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多地方需要这样的功能模块,如系统的日志输出,GUI应用必须是单鼠标,MODEM的联接需要一条且只需要一条电话线,操作系统只能有一个窗口管理器,一台PC连一个键盘。

 

单例模式有许多种实现方法,在C++中,甚至可以直接用一个全局变量做到这一点,但这样的代码显的很不优雅。 使用全局对象能够保证方便地访问实例,但是不能保证只声明一个对象——也就是说除了一个全局实例外,仍然能创建相同类的本地实例

《设计模式》一书中给出了一种很不错的实现,定义一个单例类,使用类的私有静态指针变量指向类的唯一实例,并用一个公有的静态方法获取该实例。

单例模式通过类本身来管理其唯一实例,这种特性提供了解决问题的方法。唯一的实例是类的一个普通对象,但设计这个类时,让它只能创建一个实例并提供对此实例的全局访问。唯一实例类Singleton在静态成员函数中隐藏创建实例的操作。习惯上把这个成员函数叫做Instance(),它的返回值是唯一实例的指针。

我写了个简单单例模式实现如下:

#include "stdafx.h"#include 
using namespace std;class Singleton{public: static Singleton* GetInstance() { if(m_pInstance == NULL) m_pInstance = new Singleton(); return m_pInstance; } void Show() { count ++; cout << "count=" <
<< endl; }private: Singleton(){}; static int count; static Singleton* m_pInstance; };int Singleton::count = 0;Singleton* Singleton::m_pInstance = NULL;int _tmain(int argc, _TCHAR* argv[]){ Singleton* s = Singleton::GetInstance(); s->Show(); Singleton* s2 = Singleton::GetInstance(); s2->Show(); cin.get(); return 0;}

用户访问唯一实例的方法只有GetInstance()成员函数。如果不通过这个函数,任何创建实例的尝试都将失败,因为类的构造函数是私有的。GetInstance()使用懒惰初始化,也就是说它的返回值是当这个函数首次被访问时被创建的。这是一种防弹设计——所有GetInstance()之后的调用都返回相同实例的指针:

指针s和s2 都指向同一个且唯一的实例。

单例类CSingleton有以下特征:

它有一个指向唯一实例的静态指针m_pInstance,并且是私有的;

它有一个公有的函数,可以获取这个唯一的实例,并且在需要的时候创建该实例;

它的构造函数是私有的,这样就不能从别处创建该类的实例。

转载于:https://www.cnblogs.com/JczmDeveloper/p/3158274.html

你可能感兴趣的文章
前台线程 和 后台线程
查看>>
PHP性能优化大全(转)
查看>>
shell编程
查看>>
ImageSwitch+Gallery
查看>>
【软件需求工程与建模 - 小组项目】第0周:团队成员介绍
查看>>
unresolved external symbol "public: virtual __thiscall...错误
查看>>
php连接oracle oracle开启扩展
查看>>
入门自定义标签,(在SSH里面有自定义标签的练习)
查看>>
最近遇到的一些问题汇总
查看>>
mysql插入数据报错一二
查看>>
spring mvc 常用前后台数据交互的注解
查看>>
Linux学习12-CentOS设置多个tomcat开机自启动
查看>>
ASP.NET MVC Controller 编程所涉及到的常用属性成员
查看>>
条款37:绝不重新定义继承而来的缺省参数值(Never redefine a function's inherited default parameter value)...
查看>>
HDU 4288 Coder 【线段树+离线处理+离散化】
查看>>
[K/3Cloud] 如何从被调用的动态表单界面返回数据
查看>>
c# winform读取xml创建菜单
查看>>
设计模式-工厂方法 简单工厂 抽象工厂 模板方法
查看>>
HDU - 6162(Ch’s gift)
查看>>
showModalDialog()方法
查看>>