首页 > 代码库 > 设计模式C++实现——单例模式
设计模式C++实现——单例模式
模式定义:
单例模式确保一个类只有一个实例,并提供一个全局访问点。
模式结构:
单例模式编程实现及执行结果:
#include <iostream> using namespace std;
单例类
class Sigleton { public: static Sigleton* getInstance(); private: Sigleton(){} static Sigleton* uniqueInstance; };
静态成员初始化
Sigleton* Sigleton::uniqueInstance = NULL;
成员函数实现
Sigleton* Sigleton::getInstance() { if(uniqueInstance == NULL) { uniqueInstance = new Sigleton(); } return uniqueInstance; }
客户代码
int main() { Sigleton* pSigleton1 = Sigleton::getInstance(); Sigleton* pSigleton2 = Sigleton::getInstance(); if(pSigleton1 == pSigleton2) cout << "Sigleton Successful" << endl; else cout << "Sigleton failue" << endl; return 0; }
执行结果:
Sigleton Successful
请按任意键继续. . .
应用:创建Sigleton类的子类
我们应当考虑Sigleton的多个子类,而且应用必须决定使用哪一个子类。修改Sigleton方法如下:
单例基类
class Sigleton { public: static Sigleton* getInstance(const char* name); virtual void show(){cout << "Sigleton" << endl;} protected: //基类构造函数访问权限位protected,使子类构造函数可以调用基类构造函数 Sigleton(){} private: static Sigleton* uniqueInstance; }; <pre name="code" class="cpp">Sigleton* Sigleton::uniqueInstance = NULL; Sigleton* Sigleton::getInstance(const char* name) { if(uniqueInstance == NULL) { if(strcmp(name,"SigletonA") == 0) { uniqueInstance = new SigletonA(); } else if(strcmp(name,"SigletonB") == 0) { uniqueInstance = new SigletonB(); } else { uniqueInstance = new Sigleton(); } } return uniqueInstance; }
A类子类
class SigletonA : public Sigleton { //声明基类为友元,使其可以访问A类私有构造函数 friend class Sigleton; public: void show(){cout << "SigletonA" << endl;} private: SigletonA(){} };B子类
class SigletonB : public Sigleton { friend class Sigleton; public: void show(){cout << "SigletonB" << endl;} private: SigletonB(){} };
客户代码
int main() { Sigleton* pSigleton1 = Sigleton::getInstance("SigletonA"); Sigleton* pSigleton2 = Sigleton::getInstance("SigletonA"); Sigleton* pSigleton3 = Sigleton::getInstance("SigletonB"); Sigleton* pSigleton4 = Sigleton::getInstance("SigletonB"); if(pSigleton1 == pSigleton2) cout << "SigletonA Successful" << endl; else cout << "SigletonA failue" << endl; pSigleton1->show(); pSigleton3->show(); return 0; }
执行结果:
SigletonA Successful
SigletonA
SigletonA
请按任意键继续. . .
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。