在暴风影音播放器指导者ContructManage中,调用了一系列的钩子方法,用于判断在不同播放模式下,是否需要创建对应的部件。暴风影音播放器指挥者类.h头文件实现如下:
#ifndef _CONTRUCT_MANAGE_H_
#define _CONTRUCT_MANAGE_H_
#include "PlayPattern.h"
#include "Player.h"
//建造管理器
class ContructManage
{
private:
//具体建造者
PlayPattern * m_pPlayPattern;
public:
//设计播放器模式(也就是设置具体建造者)
void SetPlayPattern(PlayPattern * pPlayPattern);
//封装建造过程,调用钩子方法,判断对应的部件是否需要建造
Player * Construct();
};
#endif 暴风影音播放器指挥者类Cpp文件实现如下:
#include "ContructManage.h"
//设计播放器模式(也就是设置具体建造者)
void ContructManage::SetPlayPattern(PlayPattern * pPlayPattern)
{
m_pPlayPattern = pPlayPattern;
}
//封装建造过程,调用一系列钩子方法,判断对应的部件是否需要建造
Player * ContructManage::Construct()
{
bool bRetVal = true;
//根据需要建造播放窗口
bRetVal = m_pPlayPattern->IsBuildWindow();
if( true == bRetVal )
{
m_pPlayPattern->BuildWindow();
}
//根据需要建造播放菜单
bRetVal = m_pPlayPattern->IsBuildMenu();
if( true == bRetVal )
{
m_pPlayPattern->BuildMenu();
}
//根据需要建造播放列表
bRetVal = m_pPlayPattern->IsBuildPlayList();
if( true == bRetVal )
{
m_pPlayPattern->BuildPlayList();
}
//根据需要建造播放进度条
bRetVal = m_pPlayPattern->IsBuildControlBar();
if( true == bRetVal )
{
m_pPlayPattern->BuildControlBar();
}
//根据需要建造收藏列表
bRetVal = m_pPlayPattern->IsBuildCollectList();
if( true == bRetVal )
{
m_pPlayPattern->BuildCollectList();
}
//返回已经建造好的播放器
Player * pPlayer = m_pPlayPattern->GetPlayer();
return pPlayer;
} 测试程序实现代码如下:
#include编译并执行,结果如下:#include "ContructManage.h" #include "PlayPattern.h" #include "Player.h" using namespace std; int main() { /***********************创建建造管理器**********************/ ContructManage * pContructManage = new ContructManage(); Player * pPlayer = NULL; /***********************完整播放模式************************/ PlayPattern * pFullPattern = new FullPattern(); cout << "完整播放模式:" << endl; pContructManage->SetPlayPattern(pFullPattern); pPlayer = pContructManage->Construct(); pPlayer->Display(); /***********************精简播放模式************************/ PlayPattern * pSimplePattern = new SimplePattern(); cout << "精简播放模式:" << endl; pContructManage->SetPlayPattern(pSimplePattern); pPlayer = pContructManage->Construct(); pPlayer->Display(); /***********************记忆播放模式************************/ PlayPattern * pMemoryPattern = new MemoryPattern(); cout << "记忆播放模式:" << endl; pContructManage->SetPlayPattern(pMemoryPattern); pPlayer = pContructManage->Construct(); pPlayer->Display(); /***********************销毁操作****************************/ cout << endl; delete pFullPattern; pFullPattern = NULL; delete pSimplePattern; pSimplePattern = NULL; delete pMemoryPattern; pMemoryPattern = NULL; delete pContructManage; pContructManage = NULL; return 0; }

通过引入钩子方法,我们可以在建造者指导者类中对复杂产品的构建进行精细的控制,不仅指定buildPartX()方法的执行顺序,还可以控制是否需要执行某个buildPartX()方法。
5、建造者模式总结
建造者模式的核心在于如何一步步构建一个包含多个组成部件的完整对象,使用相同的构建过程构建不同的产品,在软件开发中,如果我们需要创建复杂对象并希望系统具备很好的灵活性和可扩展性可以考虑使用建造者模式。
1.主要优点
建造者模式的主要优点如下:
(1) 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。建造者模式封装了产品具体的创建流程,符合"封装变化原则"。
(2) 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。由于指挥者类针对抽象建造者编程,增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合“开闭原则”,也符合"针对抽象进行编程而不是针对具体编程原则"。
(3) 可以