C ++シングルトンデザインパターン

シングルトン:これだけクラスオブジェクトを生成します。

我々は行うクラスが生成したオブジェクトの数を制限する方法を考えることができますか?私たちは、メモリを開放するには、少なくとも2つのステップを生成するターゲットは、コンストラクタを呼び出すことを知っています。私たちは、メモリの制限を開放する方法がありませんが、我々は状況が、我々はシングルトンパターンのデザインのアイデアを持って来る思考のこのラインに沿って、コンストラクタを呼び出して制御することができます。

  • シールドにコントロールのコンストラクタは、我々はコンストラクタのプライベートを設定することを生成したインターフェースをオブジェクト、それはクラスの外に呼び出されないようにしましょう。したがって、コンストラクタとコピーコンストラクタは、最初のステップにプライベートです。
  • 我々は2つの点を満たすために、この機能を設計したときに、戻りのクラスタイプは、一時的なオブジェクトを生成しますので、1クラス型を返すことができない、我々は2つのオブジェクトを持っている、ユニークなオブジェクトを生成するための共通のインタフェースを提供したいです、ではないので、私たちはクラスポインタと、必要に応じてクラスを挙げることができます。2.インタフェースオブジェクトへの依存を取り除くために、それ以外の場合は最初のオブジェクトを生成することができませんが、そうそれを静的に設定し、静的オブジェクトは、クラスによって呼び出すことができる、所属していません。
  • 我々は彼が何度も転送されたことを確認するだけでオブジェクトを生成する必要がありますので、このインタフェースは、したがって、私は最初のための場合は、お電話の際は唯一のクラス、各裁判官を保持するために、静的メンバ変数を設定峨眉山午前、何度も呼び出されます2回目の呼び出しは、直接のカテゴリを返されたかのように最初の呼び出しは、クラスが生成されます。

我々は今、この考え方に基づいて単純なクラスのシングルトンパターンを書き込むこと:

# include <iostream>
class master
{
private:
	master (char* name,bool sex)//构造函数
	{
		mname=new char[strlen(name+1)]();
		strcpy(mname,name);
		msex=sex;
	}
	master(const master&)//拷贝构造
	{}
	char *mname;
	bool msex;
	static master *pinstance;//静态成员变量,保存一个对象的地址
public:
	static master* getinstance(char* name,bool sex)//公共的接口
	{
		if(pinstance==NULL)//第一次则生成对象
		{
			pinstance=new master(name,sex);
		}
		return pinstance;//不是第一次则直接返回第一次生成的对象地址
	}
	void show()
	{
		std::cout<<"生成的对象名字为"<<mname<<std::endl;
	}
};
master* master::pinstance=NULL;//初始化静态成员
int main()
{
	master *pm1=master::getinstance("王麻子", true);//定义对象指针保存对象的地址
	master *pm2=master::getinstance("李四", true);
	master *pm3 = master::getinstance("王五", true);
	pm1->show();
	pm2->show();
	pm3->show();
}

私たちは、それはまだ1つのオブジェクトのみで、それは私たちにあるかどうか、我々は3つのオブジェクトに適用された主な機能は、プログラムは3つのオブジェクトを生成することを見ることができ、我々は以下のように、印刷機能を通じて結果を確認する必要があります。

私たちは、そのシングルトンパターンを達成するために、レンダリングされているプログラムは直接王Mazi他のオブジェクトの復帰に取り組む、システムは私たちだけのための第一の目的、王Maziを生成していることがわかります。しかし、我々は、それは危険な手順であり、我々は再びシングルトンオブジェクトを生成し、この時の非効率的な使用が呼ばれることがわかりますまた、遅延ロードとして知られている、怠惰なモードを、それがスレッドセーフでありますモード。

その後、我々は確かにSingletonパターンを達成するためにセーフモードを持つことを期待することはできません、もちろん、そこに、私は皆のために、以下の導入も貪欲ロードされたとして知られている飢えモードを、私たちは、それの意味するものを知っている名前を見ないと信じてオブジェクトがメインの前に生成され、オブジェクトを生成するために、事前に予防措置をとることが間違っているので、安全ではない何のスレッドがありません。具体的なコードは次のよう:

# include <iostream>
class master
{
private:
	master (char* name,bool sex)//构造函数
	{
		mname=new char[strlen(name+1)]();
		strcpy(mname,name);
		msex=sex;
	}
	master(const master&)//拷贝构造
	{}
	char *mname;
	bool msex;
	static master *pinstance;//静态成员变量,保存一个对象的地址
public:
	static master* getinstance(char* name,bool sex)//公共的接口
	{
		return pinstance;//直接返回已经生成的对象地址,保证只有一个对象
	}
	void show()
	{
		std::cout<<"生成的对象名字为"<<mname<<std::endl;
	}
};
master* master::pinstance=new master("王麻子",true);//在主函数之前就已经申请好了对象,所以只会有王麻子这一个对象
int main()
{
	master *pm1=master::getinstance("张三", true);//定义对象指针保存对象的地址
	master *pm2=master::getinstance("李四", true);
	master *pm3 = master::getinstance("王五", true);
	pm1->show();
	pm2->show();
	pm3->show();
}

私たちは見ることができ、静的メンバ変数を使用すると、いくつかの主要な機能の内部でそれを定義するかどうか、我々はそれmain関数が生成される前にそれがあるので、王Maziを生成したオブジェクト作られてきた1つのオブジェクトのみの初期化を保持し、ときにオブジェクトは、それは、あなたが唯一のアプリケーション内のオブジェクトを見つけるに戻るたびに、王Maziアドレス生成しません、我々は結果を見て: 

何らかのエラーがああアウトポイントを喜ばせるために、この設計のSingletonパターンは、にあります!さあ?♀️

 

 

公開された54元の記事 ウォンの賞賛8 ビュー5323

おすすめ

転載: blog.csdn.net/qq_43411555/article/details/90341421
おすすめ