建造者模式(Builder):將一個複雜對象的構造和它的表示分離,使得同樣的構造過程可以創建不用的表示。
建造模式將產品的內部表象和產品的生成過程分割開來,從而使一個建造過程可以生成具有不同內部表象的產品對象,建造者模式使得產品的內部表象可以獨立的變化,客戶端不用知道產品內部組成的細節。
UML類圖:
模式說明:
Builder:
爲創建一個產品對象的各個部件指定抽象接口。
ConcreteBuilder:
實現Builder的接口以構造和裝配該產品的各個部件,定義並明確它所創建的表示,並 提供一個檢索產品的接口。
Director:
構造一個使用Builder接口的對象。
Product:
表示被構造的複雜對象。ConcreteBuilder創建該產品的內部表示並定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產品的接口。
建造者模式基本代碼:
/********************************************************************
filename: Bulider.h
created: 2012-09-26
author: firehood
purpose: firehood 學設計模式之---建造者模式
*********************************************************************/
#include "assert.h"
#include <iostream>
using namespace std;
#pragma once
// 抽象建造者,建造的對象由PartA和PartB兩部分組成
class Builder
{
public:
Builder(void){}
~Builder(void){}
virtual void BuildPartA(void) = 0;
virtual void BuildPartB(void) = 0;
};
// 具體建造者1
class ConcreteBuilder1: public Builder
{
public:
ConcreteBuilder1(void){}
virtual ~ConcreteBuilder1(void){}
virtual void BuildPartA()
{
cout<<"建造第一種類型的產品:創建PartA"<<endl;
}
virtual void BuildPartB()
{
cout<<"建造第一種類型的產品:創建PartB"<<endl;
}
};
// 具體建造者1
class ConcreteBuilder2: public Builder
{
public:
ConcreteBuilder2(void){}
virtual ~ConcreteBuilder2(void){}
virtual void BuildPartA()
{
cout<<"建造第二種類型的產品:創建PartA"<<endl;
}
virtual void BuildPartB()
{
cout<<"建造第二種類型的產品:創建PartB"<<endl;
}
};
// 監管者,處理產品整個建造過程
class Director
{
public:
Director(Builder* pBuilder):m_pBuilder(NULL)
{
assert(pBuilder);
m_pBuilder = pBuilder;
}
virtual ~Director(void){}
void Construct(void)
{
if(m_pBuilder != NULL)
{
cout<<"建造產品中.."<<endl;
m_pBuilder->BuildPartA();
m_pBuilder->BuildPartB();
}
}
private:
Builder *m_pBuilder;
};
#include "Builder.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
cout<<"*************************************"<<endl;
cout<<"firehood 學設計模式之---建造者模式"<<endl;
cout<<"*************************************"<<endl;
Director *director;
director = new Director(new ConcreteBuilder1());
director->Construct();
delete director;
director = new Director(new ConcreteBuilder2());
director->Construct();
delete director;
system("pause");
return 0;
}
執行結果:
*************************************
firehood 學設計模式之---建造者模式
*************************************
建造產品中..
建造第一種類型的產品:創建PartA
建造第一種類型的產品:創建PartB
建造產品中..
建造第二種類型的產品:創建PartA
建造第二種類型的產品:創建PartB
請按任意鍵繼續. . .