//单例模式是设计模式中最简单的形式之一。 //这一模式保证一个类只能有一个唯一实例,并提供一个访问它的全局访问点。 //单例模式实现:将构造私有化,通过工厂方法去来实现唯一的实例。 #include <iostream> using namespace std; class Signal { private: //私有化构造 Signal(); static Signal* instance;//全局的访问点,指向唯一实例 int var;//用于测试的成员变量 public: static Signal * GetInstance();//工厂方法 int getVar(); void setVar(int var); virtual ~Signal(); }; Signal::Signal(){ this->var = 20; cout<<"Signal constructor" << endl; } Signal::~Signal(){ cout << "Signal Destructor" << endl; } Signal* Signal::instance = new Signal(); Signal * Signal::GetInstance() { return instance; } int Signal::getVar() { return this->var; } void Signal::setVar(int var) { this->var = var; } int main() { Signal * p1 = Signal::GetInstance(); Signal * p2 = Signal::GetInstance(); cout << p1->getVar() << endl; cout << p2->getVar() << endl; p1->setVar(200); cout << p1->getVar() << endl; cout << p2->getVar() << endl; }
上面是一个C++的单例模式测试程序,那么单例模式一般在什么情况下使用呢?
假想一下:我们为太阳系设计一个系统,其中有一个借口叫做星球,有一个实现类叫做地球,地球只有一个,那么怎么办?用单例( 上举例感谢可爱的网友童鞋!)。
从程序的角度看,单例模式可以减少内存的开销,屏蔽创建多个对象导致的复杂性。
从系统的角度来看:对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。
看了上面所述,可以看出单例模式有三大要素:
1.单例模式的类只提供私有的构造函数。
2.类定义中含有一个该类的静态私有对象。
3.该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象。
希望到此为止,大家能对单例模式有一定的了解!最后送上一个想念老婆的C程序员写的一个简单的单例模式程序!
View Code
1 #include <iostream> 2 using namespace std; 3 4 class wife 5 { 6 private: 7 wife(); 8 static wife * instance; 9 public: 10 static wife * marry(); 11 ~wife(); 12 bool smile(); 13 bool cry(); 14 bool angry(); 15 void cryToSmile(); 16 void love(); 17 }; 18 19 wife::wife(){ 20 cout << "老婆你是:"<< endl; 21 cout << "世界上最美丽的" << endl; 22 cout << "世界上最温柔的" << endl; 23 cout << "世界上最勤劳的" << endl; 24 cout << "世界上最善良的" << endl; 25 cout << "你也是:" << endl; 26 cout << "世界上最懂我的" << endl; 27 cout << "世界上最疼我的" << endl; 28 cout << "世界上最精心照顾我的" << endl; 29 cout << "你是我一生最爱的人" << endl; 30 } 31 32 wife * wife::instance = new wife(); 33 34 wife* wife:: marry(){ 35 return instance; 36 } 37 38 bool wife::smile() 39 { 40 cout << "(*∩_∩*)(老婆)" << endl; 41 return true; 42 } 43 44 bool wife::cry() 45 { 46 cout << "::>_<:: (老婆)" << endl; 47 return true; 48 } 49 50 51 bool wife::angry() 52 { 53 cout << "o(︶︿︶)o(老婆)" << endl; 54 return true; 55 } 56 57 void wife::cryToSmile() 58 { 59 cout << "::>_<:: ---> (*∩_∩*)(老婆)" << endl; 60 } 61 62 void wife::love() 63 { 64 cout << "我只想告诉你:我爱你,永远!" << endl; 65 } 66 67 int main() 68 { 69 wife * xifu = wife::marry(); 70 cout << "如果老婆笑了:" << endl; 71 if(xifu->smile()){ 72 cout << "我也很开心" << endl; 73 } 74 cout << "如果老婆哭了:" << endl; 75 if(xifu->cry()){ 76 cout << "我哄你笑" << endl; 77 } 78 cout << "生活中有很多琐碎、摩擦" << endl; 79 cout << "如果老婆生气了:" << endl; 80 if(xifu->angry()){ 81 cout << "都是我的错,是我不好!亲老婆不要生气..." << endl; 82 } 83 cout << "直到..." << endl; 84 xifu->cryToSmile(); 85 cout << "希望能这样平平静静的牵着你的手,一直走" << endl; 86 xifu->love(); 87 cout << "\t\t\t\t---你家掌柜的" << endl; 88 }
打印结果: