单例模式---设计模式
来源:互联网 发布:条码价签打印软件 编辑:程序博客网 时间:2024/06/07 20:48
1.定义:其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。
具体的例子:购物车;系统的日记输出;
2.实现:
(1)实现一:(只适应与单线程的环境)
class Singleton{public: static Singleton *GetInstance() { if(instance==NULL) { instance=new Singleton; return instance; } return instance; } static void DeleteInstance() { if(instance!=NULL) { delete instance; instance=NULL; } }private: Singleton() { } static Singleton *instance;};Singleton *Singleton::instance=NULL;
(2)实现二:在多线程的情况下,就可能创建多个Singleton实例
加上一个同步锁;
class Singleton{public: static Singleton *GetInstance() { Lock(); if(instance==NULL) { instance=new Singleton; return instance; } UnLock(); return instance; } static void DeleteInstance() { if(instance!=NULL) { delete instance; instance=NULL; } }private: Singleton() { } static Singleton *instance;};Singleton *Singleton::instance=NULL;
(3)实现三:
要实现的操作只是在实例没有创建之前需要进行加锁操作,以保证只有一个线程能够创建实例。
class Singleton{public: static Singleton *GetInstance() { if(instance==NULL) { Lock(); if(instance==NULL) { instance=new Singleton; } UnLock(); } return instance; } static void DeleteInstance() { if(instance==NULL) { delete instance; instance=NULL; } }private: static Singleton *instance; Singleton() { }};Singleton Singleton::instance=NULL;
(4)实现四:
实现像智能指针的行为,自动释放内存空间。
class Singleton{private: Singleton() { } class Test { public: ~Test() { if(instance!=0) { cout<<"the descontructor is running"<<endl; delete instance; instance=0; } } }; static Test te; static Singleton *instance;public: static Singleton *GetInstance() { return instance; }};Singleton *Singleton::instance=new Singleton();Singleton::Test Singleton::te;
0 0
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- 设计模式---单例模式
- 【设计模式】单例模式
- 设计模式-单例模式
- 设计模式----单例模式
- 设计模式--单例模式
- 设计模式-单例模式
- 设计模式-单例模式
- [设计模式] 单例模式
- 设计模式--单例模式
- 设计模式---单例模式
- 设计模式--单例模式
- 设计模式 -----单例模式
- 设计模式:单例模式
- 使用GridView实现九宫格的菜单
- HDU 4341 Gold miner (分组背包)
- 读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组
- Android UI开发篇之 ViewPager+九宫格布局 实现左右滑动
- 浅谈数据库中的触发器
- 单例模式---设计模式
- 新手福利:Apache Spark入门攻略
- 安装MySQL最后一步出现错误Error Nr.1045解决方法
- C++暂停黑窗口 system( “pause “);(getch(),getchar(),system(pause)的联系和区别!!!)
- HDU 3853 LOOPS (概率DP水题)
- Android 设置默认Launcher
- stl非变易算法(一)
- 【转】Qt经典出错信息之undefined reference to `vtable for classname'
- 故障案例:主从同步报错Fatal error: The slave I/O thread stops because master and slave have equal MySQL server