单例模式
2016-02-20 16:18
134 查看
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。
如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。
一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。
单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。单例模式又名单件模式或单态模式。
其UML图如下:
以下是简单的C++实现:
头文件:
实现:
测试代码:
如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。
一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。
模式定义
单例模式 : 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例(只要包含了该类头文件,那么整个系统将只有一个实例),这个类称为单例类,它提供全局访问的方法。单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。单例模式又名单件模式或单态模式。
其UML图如下:
以下是简单的C++实现:
头文件:
//Singleton.h class Singleton { private: Singleton(); //防止外界利用new创建此类的可能 public: static Singleton* getInstance(); void singletonOperation(); };
实现:
Singleton.cpp // Implementation of the Class #include "Singleton.h" #include <iostream> using namespace std; Singleton * Singleton::instance = NULL; Singleton::Singleton() {} Singleton::~Singleton() { delete instance; } Singleton* Singleton::getInstance() { if (instance == NULL) { instance = new Singleton(); } return instance; } void Singleton::singletonOperation() { cout << "singletonOperation" << endl; }
测试代码:
#include <iostream> #include "Singleton.h" using namespace std; int main(int argc, char *argv[]) { Singleton * sg = Singleton::getInstance(); sg->singletonOperation(); return 0; }
小结
单例模式是一种保证整个程序只有一个类实例的设计方法。应该提供接口用于获得实例对象(如getInstance),并且避免主动调用new来实例化对象。相关文章推荐
- 根据数组元素包含某字符串过滤并生成新的数组
- 介绍 Android DropBoxManager Service
- CodeForces 626C Block Towers
- Jmeter报告优化之New XSL stylesheet
- Jmeter默认报告优化
- list 基本操作 1 -- 创建,插入,删除,计算长度
- PHP绘图函数生成图片验证码
- CodeForces 626B Cards
- nginx的基本使用(启动、关闭及域名映射访问)
- 搭建持续集成接口测试平台(Jenkins+Ant+Jmeter)
- shiro入门实战笔记(11)--加密/解密
- Android属性动画一
- 站在巨人的肩膀上看ADO.Net
- SPOJ705 SUBST1 - New Distinct Substrings(后缀数组)
- hibernate对象三种状态
- CodeForces 626A Robot Sequence
- ANT批量执行Jmeter脚本
- 给定一列字符,生成指定长度的所有可能的组合
- 设置grub密码
- Linux C语言应用 - main函数解析,时间函数,C语言代码的分配机制(malloc,calloc,realloc,free)