最近学习了下《head first设计模式》,先对单例模式做个简单的总结。
单例模式用一句话概括就是只产生一个对象,那为啥不用全局变量来代替单例模式呢?
全局变量是程序在一开始就创建好对象,如果这个对象非常耗费资源,程序的执行又用不到它,那就太浪费了。而单例可以在需要它的时候再创建它。
//2013-4-10 10:07 //单例设计模式 class MySingleton { public: ~MySingleton(); static MySingleton* GetInstance(); private: MySingleton(); };
#include "singleton.h" MySingleton::~MySingleton() { } MySingleton::MySingleton() { } MySingleton* MySingleton::GetInstance() { static MySingleton* pInstance = new MySingleton(); return pInstance; }
int main(int argc,char* argv[]) { MySingleton* pMySingleton = MySingleton::GetInstance(); MySingleton* pMySingleton1 = MySingleton::GetInstance(); delete pMySingleton; delete pMySingleton1; return 0; }
//singleton.h #pragma once #include <iostream> using namespace std; class MySingleton { private: static MySingleton* pInstance; public: static MySingleton* GetInstance(); class SingletonGarbo // 它的唯一工作就是在析构函数中删除CSingleton的实例 { public: ~SingletonGarbo() { //测试用 cout<<"SingletonGarbo::~SingletonGarbo()"<<endl; if (0 != MySingleton::pInstance) { delete MySingleton::pInstance; MySingleton::pInstance = 0; } } }; private: MySingleton(); ~MySingleton();//防止在不合适的地方释放了 };
//singleton.cpp #include "singleton.h" MySingleton* MySingleton::pInstance = 0; MySingleton::SingletonGarbo garbo; MySingleton::~MySingleton() { } MySingleton::MySingleton() { } MySingleton* MySingleton::GetInstance() { if ( pInstance == 0) { pInstance = new MySingleton(); } return pInstance; }
if ( pInstance == 0) //线程1访问,刚好到此时间片轮换 { pInstance = new MySingleton(); } return pInstance;
//线程2开始执行 if ( pInstance == 0) { pInstance = new MySingleton(); } return pInstance;
MySingleton* MySingleton::GetInstance() { lock(); if ( pInstance == 0) { pInstance = new MySingleton(); } unlock(); return pInstance; }
MySingleton* MySingleton::GetInstance() { if ( pInstance == 0) { lock(); if ( pInstance == 0) { pInstance = new MySingleton(); } unlock();} return pInstance; }
Singleton模式是常用的设计模式之一,但是要实现一个真正实用的设计模式却也不是件容易的事情。
http://www.cppblog.com/dyj057/archive/2005/09/20/346.html