C++設計モードの構築者モード(二)
3、指揮者Directorの作成者パターンを省略する
指揮者クラスDirectorは、BuilderのbuildPartX()メソッドを一定の順序で呼び出し、呼び出しの前後順序を制御し、クライアントに完全な製品オブジェクトを返す、特定の構築者にどのように製品を構築するかを指導するために、構築者モードで非常に重要な役割を果たします.Directorは抽象的なコンストラクタに対してプログラミングを行い,異なるコンストラクタが必要であれば,コンストラクタを指揮者クラスに転送するだけで,以前のコードを変更する必要はない.
場合によっては、システム構造を簡素化するために、指揮者Directorを省略することができ、指揮者は製品の作成プロセスを指導しなくなります.Builderで複雑な製品オブジェクトを逐次構築するconstruct()メソッドを提供します.
嵐影音プレーヤーは具体的な製品で、実装コードは前のブログと同じように、ここでは表示されません.変化するのはコンストラクタクラス、再生モードである.hヘッダファイル実装コードは以下の通りである.
アドバイザクラスは、嵐のAV製品オブジェクトの作成プロセスを指導するのではなく、抽象的なプレーヤーモードStartConstructメソッドによってプレーヤー製品の作成プロセスをカプセル化します.再生モードCppファイルコードは以下の通りです.
フルプレイモードではコレクションリスト部品を作成する必要はありませんので、コレクションリストの内容を空にします.その他の場合は、作成する必要のない部品内容を空にします.テストプログラムの実装コードは以下の通りです.
コンパイルおよび実行の結果は次のとおりです.
このときStartConstruct()メソッドは、他のbuildPartX()メソッド呼び出しの順序を定義し、他のメソッドの実行にフローテンプレートを提供します.これは、後で学習するテンプレートメソッドモードと非常に似ています.Directorクラスの省略は、システムの柔軟性と拡張性に影響を与えないとともに、システム構造を簡素化しますが、抽象的な構築者クラスの役割を強化します.StartConstruct()メソッドが複雑で、製品の構成部分が多い場合は、StartConstruct()メソッドを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に単独でカプセル化することをお勧めします.これは、「単一の職責原則」に合致します.