- 单例模式定义:单例对象必须保证有且仅有一个实例存在,这个实例不允许被拷贝。
- 实现单例模式的思路是:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。
-
#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; class ChairMan { public: //返回主席指针 static ChairMan* getInstance() { return singleMan; } private: //将构造函数私有化,不可以创建多个对象 ChairMan() { //cout << "ChairMan默认构造函数调用" << endl; }; ChairMan(const ChairMan &c) { cout << "ChairMan拷贝构造函数调用" << endl; }; //数据是共享的,只需要拿到一个主席的对象指针 //public: static ChairMan* singleMan; }; ChairMan* ChairMan::singleMan = new ChairMan;//唯一的主席类指针 void test01() { /*ChairMan c1; ChairMan c2; ChairMan* c3 = new ChairMan;*/ /*ChairMan* c1 = ChairMan::singleMan; ChairMan* c2 = ChairMan::singleMan;*/ //当public 被注释掉 就无法直接访问singleMan了 /*if (c1 == c2) { cout << "c1与c2相等" << endl; } else { cout << "c1与c2不等" << endl; }*/ //ChairMan::singleMan = NULL; //getInstance ChairMan* c1 = ChairMan::getInstance(); ChairMan* c2 = ChairMan::getInstance(); if (c1 == c2) { cout << "c1与c2相等" << endl; } else { cout << "c1与c2不等" << endl; } //ChairMan* c3 = new ChairMan(*c1);//调用拷贝构造函数 要让拷贝构造函数私有化 //if (c1 == c3) //{ // cout << "c1与c3相等" << endl; //} //else //{ // cout << "c1与c3不等" << endl; //} } int main() { test01(); //cout << "main函数调用" << endl; system("pause"); return 0; }