设计模式——单键模式(singleton)
来源:互联网 发布:mac安装找不到磁盘 编辑:程序博客网 时间:2024/06/06 04:52
Singleton 模式解决问题十分常见,我们怎样去创建一个唯一的变量(对象)?在基于对象的设计中我们可以通过创建一个全局变量(对象)来实现,在面向对象和面向过程结合的设计范式(如 C++中)中,我们也还是可以通过一个全局变量实现这一点。但是当我们遇到了纯粹的面向对象范式中,这一点可能就只能是通过 Singleton 模式来实现了,可能这也正是很多公司在招聘 Java 开发人员时候经常考察 Singleton 模式的缘故吧。
作用:
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
UML结构图:
解析:
Singleton模式其实是对全局静态变量的一个取代策略,上面提到的Singleton模式的两个作用在C++中是通过如下的机制实现的:1)仅有一个实例,提供一个类的静态成员变量,大家知道类的静态成员变量对于一个类的所有对象而言是惟一的 2)提供一个访问它的全局访问点,也就是提供对应的访问这个静态成员变量的静态成员函数,对类的所有对象而言也是惟一的。在C++中,可以直接使用类域进行访问而不必初始化一个类的对象。
实例:
下面的实现其实是Singleton的一个简单实现,并不是特别的通用,一般的,如果一个项目中需要使用到Singleton模式比较多的话,那么一般会实现一个Singleton的模板类,模板类的模板参数是需要采用Singleton模式的类,比如这样实现:
Singleton.h #ifndef SINGLETON_H #define SINGLETON_H class Singleton { public: Singleton(){}; ~Singleton(){}; // 静态成员函数,提供全局访问的接口 static Singleton* GetInstancePtr(); static Singleton GetInstance(); void Test(); private: // 静态成员变量,提供全局惟一的一个实例 static Singleton* m_pStatic; }; #endif
Singleton.cpp #include "Singleton.h" #include // 类的静态成员变量要在类体外进行定义 Singleton* Singleton::m_pStatic = NULL; Singleton* Singleton::GetInstancePtr() { if (NULL == m_pStatic) { m_pStatic = new Singleton(); } return m_pStatic; } Singleton Singleton::GetInstance() { return *GetInstancePtr(); } void Singleton::Test() { std::cout << "Test!n"; }
Main.cpp #include "Singleton.h" #include int main() { // 不用初始化类对象就可以访问了 Singleton::GetInstancePtr()->Test(); Singleton::GetInstance().Test(); system("pause"); return 0; }
- 设计模式——单键模式(singleton)
- 单键模式--Singleton
- 设计模式——singleton
- 设计模式——Singleton
- 设计模式——单列模式 Singleton
- Singleton模式——设计模式学习
- C++设计模式——Singleton模式
- 设计模式(2)—Singleton模式
- 设计模式—Singleton单件模式
- 设计模式——Abstract Factory模式、Singleton模式
- 设计模式1——Singleton设计模式
- 设计模式1——Singleton设计模式
- 设计模式1——Singleton设计模式
- 设计模式——深入浅出单实例Singleton设计模式
- 设计模式-----Singleton模式
- 设计模式-Singleton模式
- 设计模式--Singleton模式
- 设计模式-------Singleton模式
- 合理设置 让你的迅雷下载速度越来越快
- Android动画Animation之Frame实现类似电影的动画效果
- 嚣张"老鸟"你别看! 7种隐藏私密文件妙法
- 【線段樹】簡單題(easy)
- 优化自己的电脑 系统瘦身8大方法
- 设计模式——单键模式(singleton)
- 教你看进程
- 【线段树】easy
- 开始→运行→命令集锦
- windows中read错误
- 关于Socket程序中的ntohs, ntohl, htons,htonl
- web服务器权限问题
- 有关windows的web服务器的问题
- 我的第一个OpenGL 程序