什么是单例模式?
保证一个类只有一个实例,并提供一个访问它的全局访问点。【DP】
让类的自身负责保存它的唯一实例,这个类保证没有其他实例可以被创建,并且此类可以提供一个访问该实例的方法。【DP】
什么时候需要单例模式?
程序只需要一个方法控制某项功能,不允许创建第二个此功能。比如:银行使用的取号机。
使用单例模式需要了解C++static关键字的用法我的这篇博文对static作了浅析
测试用例:
[code]int main(){ //单例模式初始化两个实例的方法 Singleton *s1 = Singleton::getInstance(); Singleton *s2 = Singleton::getInstance(); if(s1 == s2) std::cout << "Two the objects are the same instance.\n"; else std::cout << "Two the objects are the different instance.\n"; return 0; }
单例模式实现:
[code]class Singleton{ private: //将构造函数声明为私有的,从而保证只允许类内使用 Singleton(){} //声明一个类的静态对象(类外初始化) static Singleton *instance; public: //静态成员方法,提供一个访问仅有实例的全局访问点。即提供接口创建对象 static Singleton* getInstance(){ if(instance != NULL){ instance = new Singleton; } return instance; } }; //类外部初始化静态成员变量(静态成员变量必须被初始化) Singleton* Singleton::instance = NULL;
附:若为多线程编程情况下,需要加锁并做两次判断是否为空。
[code]class Singleton{ private: //将构造函数声明为私有的,从而保证只允许类内使用 Singleton(){} //声明一个类的静态对象(类外初始化) static Singleton *instance; public: //静态成员方法,提供一个访问仅有实例的全局访问点。即提供接口创建对象 static Singleton* getInstance(){ if(instance != NULL){ lock(syncObj){ if(instance != NULL){ instance = new Singleton; }//if }//lock }//if return instance; } }; //类外部初始化静态成员变量(静态成员变量必须被初始化) Singleton* Singleton::instance = NULL;
加lock是为了两个线程只有一个进入,另一个线程排队等候。第一个线程进入并出来后,后者才能进入。第二个判空是为了保证第一个线程创建了实例,第二个线程进入后就不再创建实例。
以上就是C++设计模式浅识单例模式的内容,更多相关内容请关注PHP中文网(www.php.cn)!