C++設計モードの構築者モード(二)


3、指揮者Directorの作成者パターンを省略する
指揮者クラスDirectorは、BuilderのbuildPartX()メソッドを一定の順序で呼び出し、呼び出しの前後順序を制御し、クライアントに完全な製品オブジェクトを返す、特定の構築者にどのように製品を構築するかを指導するために、構築者モードで非常に重要な役割を果たします.Directorは抽象的なコンストラクタに対してプログラミングを行い,異なるコンストラクタが必要であれば,コンストラクタを指揮者クラスに転送するだけで,以前のコードを変更する必要はない.
場合によっては、システム構造を簡素化するために、指揮者Directorを省略することができ、指揮者は製品の作成プロセスを指導しなくなります.Builderで複雑な製品オブジェクトを逐次構築するconstruct()メソッドを提供します.
嵐影音プレーヤーは具体的な製品で、実装コードは前のブログと同じように、ここでは表示されません.変化するのはコンストラクタクラス、再生モードである.hヘッダファイル実装コードは以下の通りである.
#ifndef _PLAY_PATTERN_H_
#define _PLAY_PATTERN_H_
#include <iostream>
#include <string>
#include "Player.h"
using namespace std;

//      
class PlayPattern
{
protected:
	//    (   )
	Player * m_pPlayer;
public:
	PlayPattern()
	{
		m_pPlayer = new Player();
	}

	~PlayPattern()
	{
		if( NULL != m_pPlayer )
		{
			delete m_pPlayer;

			m_pPlayer = NULL;
		}
	}
	
	//      
	virtual void BuildWindow() = 0;

	//      
	virtual void BuildMenu() = 0;

	//      
	virtual void BuildPlayList() = 0;

	//       
	virtual void BuildControlBar() = 0;

	//      
	virtual void BuildCollectList() = 0;

	//    ,      
	Player * StartConstruct()
	{
		BuildWindow();
		BuildMenu();
		BuildPlayList();
		BuildControlBar();
		BuildCollectList();
		
		return m_pPlayer;
	}
};


//      
class FullPattern : public PlayPattern
{
public:
	void BuildWindow();
	void BuildMenu();
	void BuildPlayList();
	void BuildControlBar();
	void BuildCollectList();
};


//      
class SimplePattern : public PlayPattern
{
public:
	void BuildWindow();
	void BuildMenu();
	void BuildPlayList();
	void BuildControlBar();
	void BuildCollectList();
};


//      
class MemoryPattern : public PlayPattern
{
public:
	void BuildWindow();
	void BuildMenu();
	void BuildPlayList();
	void BuildControlBar();
	void BuildCollectList();
};

#endif

アドバイザクラスは、嵐のAV製品オブジェクトの作成プロセスを指導するのではなく、抽象的なプレーヤーモードStartConstructメソッドによってプレーヤー製品の作成プロセスをカプセル化します.再生モードCppファイルコードは以下の通りです.
#include "PlayPattern.h"

//      
void FullPattern::BuildWindow()
{
	m_pPlayer->SetWindow("     ");
}

//      
void FullPattern::BuildMenu()
{
	m_pPlayer->SetMenu("   ");
}

//      
void FullPattern::BuildPlayList()
{
	m_pPlayer->SetPlayList("    ");
}

//       
void FullPattern::BuildControlBar()
{
	m_pPlayer->SetControlBar("   ");
}

//      ,            ,     
void FullPattern::BuildCollectList()
{
	m_pPlayer->SetCollectList(" ");
}

////////////////    ///////////////////////////////

void SimplePattern::BuildWindow()
{
	m_pPlayer->SetWindow("     ");
}

void SimplePattern::BuildMenu()
{
	m_pPlayer->SetMenu(" ");
}

void SimplePattern::BuildPlayList()
{
	m_pPlayer->SetPlayList(" ");
}

void SimplePattern::BuildControlBar()
{
	m_pPlayer->SetControlBar("   ");
}

void SimplePattern::BuildCollectList()
{
	m_pPlayer->SetCollectList(" ");
}

/////////////////    ////////////////////////////////

void MemoryPattern::BuildWindow()
{
	m_pPlayer->SetWindow("     ");
}

void MemoryPattern::BuildMenu()
{
	m_pPlayer->SetMenu(" ");
}

void MemoryPattern::BuildPlayList()
{
	m_pPlayer->SetPlayList(" ");
}

void MemoryPattern::BuildControlBar()
{
	m_pPlayer->SetControlBar("   ");
}

void MemoryPattern::BuildCollectList()
{
	m_pPlayer->SetCollectList("    ");
}

フルプレイモードではコレクションリスト部品を作成する必要はありませんので、コレクションリストの内容を空にします.その他の場合は、作成する必要のない部品内容を空にします.テストプログラムの実装コードは以下の通りです.
#include <iostream>
#include "PlayPattern.h"
#include "Player.h"

using namespace std;

int main()
{
	Player * pPlayer = NULL;

	/***********************      ************************/
	PlayPattern * pFullPattern = new FullPattern();
	cout << "      :" << endl;
	pPlayer = pFullPattern->StartConstruct();
	pPlayer->Display();

 	/***********************      ************************/
	SimplePattern * pSimplePattern = new SimplePattern();
	cout << "      :" << endl;
	pPlayer = pSimplePattern->StartConstruct();
	pPlayer->Display();
 
 	/***********************      ************************/
	MemoryPattern * pMemoryPattern = new MemoryPattern();
	cout << "      :" << endl;
	pPlayer = pMemoryPattern->StartConstruct();
	pPlayer->Display();

	/***********************    ****************************/
	cout << endl;
	delete pFullPattern;
	pFullPattern = NULL;

	delete pSimplePattern;
	pSimplePattern = NULL;

	delete pMemoryPattern;
	pMemoryPattern = NULL;

	return 0;
}

コンパイルおよび実行の結果は次のとおりです.
このときStartConstruct()メソッドは、他のbuildPartX()メソッド呼び出しの順序を定義し、他のメソッドの実行にフローテンプレートを提供します.これは、後で学習するテンプレートメソッドモードと非常に似ています.Directorクラスの省略は、システムの柔軟性と拡張性に影響を与えないとともに、システム構造を簡素化しますが、抽象的な構築者クラスの役割を強化します.StartConstruct()メソッドが複雑で、製品の構成部分が多い場合は、StartConstruct()メソッドをDirectorに単独でカプセル化することをお勧めします.これは、「単一の職責原則」に合致します.