1. 程式人生 > >設計模式之建造者模式(C++)

設計模式之建造者模式(C++)

設計模式之建造者模式

建造者模式,將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

其UML圖如下:
建造者模式UML圖
簡單理解就是Builder中定義了建立Product各個部分的介面。ConcreteBuilder中具體實現了建立Product中的各個部分的介面,就是具體的建造者。Director是根據使用者的需求構建Product的(具體怎麼構建,怎麼把Product中的各個部件構建起來。)該模式主要用於建立一些複雜的物件,這些兌現內部構建的建造順序通常是穩定的,但物件內部的構建通常面臨著複雜的變化。

說到這裡建造者模式具體實現的功能與模板方法模式有點類似。比如可以有不同得ConcreteBuilder類實現不同得建立方式。這樣從應用上模板方法模式和建造者模式實現的功能是很相似的。但是建造者模式的側重點是在於Director的不同,可以有不同的呈現方式,而模板方法模式的側重點是演算法中每一步實現的不同。另外,它們的類之間的關係是不同的。模板方法是通過繼承的方式來實現的,而建造者模式是通過組合的方式實現的。模板方法模式主要用於執行不同的演算法,建造者模式主要用於構建物件。不過者兩種模式其實都可以實現很多相似的功能。這也沒什麼,本來同樣的功能的實現方式也是多種多樣的。主要看需求。另外在實際寫程式的時候也不必拘泥於某種設計模式,只要遵守相關的原則,使整個程式高效、穩定、易擴充套件、易維護就行。兩者使用的場景也有區別。其示例程式碼如下:

// BuilderModel.h檔案
#pragma once
#include <iostream>
#include <vector>
#include <string>

// 產品類
class Product
{
public:
	void Add(std::string str)
	{
		m_vec.push_back(str);
	}
	void Show()
	{
		for (auto it = m_vec.cbegin(); it != m_vec.cend(); it++)
		{
			std::cout << *it <<
std::endl; } } private: std::vector<std::string> m_vec; }; // 建造者類 class Builder { public: virtual void BuildPartA() = 0; virtual void BuildPartB() = 0; virtual void BuildPartC() = 0; virtual Product getResult() = 0; }; class ConcreteBuilder_0 : public Builder { public: ConcreteBuilder_0() :
m_p(nullptr) { m_p = new Product(); } virtual ~ConcreteBuilder_0() { if (nullptr == m_p) delete m_p; } virtual void BuildPartA() { std::string str = "Builder_0 BuildPartA"; m_p->Add(str); } virtual void BuildPartB() { std::string str = "Builder_0 BuildPartB"; m_p->Add(str); } virtual void BuildPartC() { std::string str = "Builder_0 BuildPartC"; m_p->Add(str); } Product getResult() { return *m_p; } private: Product * m_p; }; class ConcreteBuilder_1 : public Builder { public: ConcreteBuilder_1() : m_p(nullptr) { m_p = new Product(); } virtual ~ConcreteBuilder_1() { if (nullptr == m_p) delete m_p; } virtual void BuildPartA() { std::string str = "Builder_1 BuildPartA"; m_p->Add(str); } virtual void BuildPartB() { std::string str = "Builder_1 BuildPartB"; m_p->Add(str); } virtual void BuildPartC() { std::string str = "Builder_1 BuildPartC"; m_p->Add(str); } Product getResult() { return *m_p; } private: Product * m_p; }; // 指揮者類 class Director { public: // 具體怎麼實現根據需求 void build(Builder *p) { p->BuildPartA(); p->BuildPartC(); p->BuildPartB(); } };

測試程式碼如下:

#include <iostream>
#include "BuilderModel.h"

int main()
{
	using namespace std;
	// 建造者模式
	Builder *builder= new ConcreteBuilder_0();
	Director * director = new Director();
	director->build(builder);
	builder->getResult().Show();

	delete builder;
	builder = new ConcreteBuilder_1();
	director->build(builder);
	builder->getResult().Show();
	getchar();
	return 0;
}

測試結果如下圖:
在這裡插入圖片描述