設計模式之建造者模式(C++)
阿新 • • 發佈:2019-02-20
設計模式之建造者模式
建造者模式,將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
其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;
}
測試結果如下圖: