設計模式筆記之---建造者模式

建造者模式(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
請按任意鍵繼續. . .


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章