C+----一例モードとケース


単一モード:
目的:クラスにインスタンスが1つしかないように、インスタンスは自分で解放する必要はありません.
実装方法:
デフォルトのコンストラクション関数とコピーコンストラクション関数をプライベート化します.
内部でオブジェクトポインタを維持します.
プライベート化ユニークポインタ;
このポインタにアクセスするためにgetInstanceメソッドを対外的に提供します.
(新しいオブジェクトを変更して作成する方法は外部にはありません)
保証クラスにはインスタンス化が1つしかありません.
例:
会社の議長を作成します.
需要:クラス内のオブジェクトを作成し、このようなオブジェクトインスタンスが1つしかないことを保証する単一のモード.
class ChairMan
{
public:
	ChairMan(){}



};

void test01() 
{
	ChairMan c1;
	ChairMan * c2 = new ChairMan; //     ;
	ChairMan * c3 = new ChairMan;
	//       chairman   ,      ;
}

//*****************************************************************************************************************************************************
改善1:newでインスタンスオブジェクトを新規作成できないようにする
class ChairMan
{
	//1.    :     ;
	//  :         ,      ?
	//    new            。              ;
private:
	ChairMan()
	{
		cout << "      " << endl;
	}

public:
	static ChairMan * singleMan;
	//        ,     ,    (   );
};
ChairMan * ChairMan::singleMan = new ChairMan;
//                  ,    ;

void test01()
{
	ChairMan::singleMan;	//        ;
}

int main()
{
	cout << "  main" << endl;
	test01;
    return 0;
}
//      : "      ",  "  main"
//    main   ;
//  ,           static          ;

//*****************************************************************************************************************************************************
改善2:コピーコンストラクション関数の処理:
class ChairMan
{
	//1.    :     ;
	//  :         ,      ?
	//    new            。              ;
private:
	ChairMan()
	{
		cout << "      " << endl;
	}

	ChairMan(const ChairMan&c){}

//  get       :
public:
	static ChairMan * getInstance()
	{
		return singleMan;
	}

private:
	//               ;
	static ChairMan * singleMan;
	//           ,       ;

	
};
ChairMan * ChairMan::singleMan = new ChairMan;
//                  ,    ;

void test01()
{
	ChairMan * cm1 = ChairMan::getInstance();//       ,      ;
	ChairMan * cm2 = ChairMan::getInstance();
	if (cm1 == cm2) {
		cout << "cm1 cm2   " << endl;
	}
	else {
		cout << "cm1 cm2    " << endl;
	}

	ChairMan * cm3 = new ChairMan(*cm2); //        ;

	if (cm3 == cm2) {
		cout << "cm3 cm2   " << endl;
	}
	else {
		cout << "cm3 cm2    " << endl;
	}
}


int main()
{
	//cout << "  main" << endl;
	test01();
	return 0;
}

//  cm1,cm2  ;cm2,cm3   ;
//cm3            ;

この場合、cm 3は新しいオブジェクトを作成し、改善を続けます.
//    cm3,            ;
//  :

class ChairMan
{
	//1.    :     ;
	//  :         ,      ?
	//    new            。              ;
private:
	ChairMan()
	{
		cout << "      " << endl;
	}

	//       ;
	ChairMan(const ChairMan&c) {}

	//  get       :
public:
	static ChairMan * getInstance()
	{
		return singleMan;
	}

private:
	//               ;
	static ChairMan * singleMan;
	//           ,       ;


};
ChairMan * ChairMan::singleMan = new ChairMan;

//  cm3      。

プリンタケース:
印刷機能と統計機能を提供します.
class Print
{
private:
	Print() { m_Count = 0; }	//       
	Print(const Print &p);	//       

	static Print * singlePrint;	//      ,   print   ;

	int m_Count;
public:
	static Print * getInstance() 
	{	//    ,getInstance;
		return singlePrint ;
	}

	//    :      
	void printText(string text) 
	{
		cout << text << endl;
		m_Count++;
		cout << "       :" << m_Count << endl;
	}
};

//       ,    ,    (  )
Print * Print::singlePrint = new Print;	//          ;

void test01()
{
	Print * p1 = Print::getInstance();	//     ;

	p1->printText("    ");
	p1->printText("    ");
	p1->printText("    ");
	p1->printText("    ");
	p1->printText("    ");

}

int main()
{
	test01();
	system("pause");
	return 0;
}