一.意圖 將一個複雜對象的構建與它的表示分離,使得同樣的構造過程可以創建不同的表示。 二.動機 一個複雜的對象的構造過程中,原料相同,可能會要求生產不同的產品,並且生產的產品種類還能夠方便的增加。Bulider模式期望將解析原材料的過程與利用原材料生產產品的過程分離開,以達到用戶不需要知道根據原材料 ...
一.意圖
將一個複雜對象的構建與它的表示分離,使得同樣的構造過程可以創建不同的表示。
二.動機
一個複雜的對象的構造過程中,原料相同,可能會要求生產不同的產品,並且生產的產品種類還能夠方便的增加。Bulider模式期望將解析原材料的過程與利用原材料生產產品的過程分離開,以達到用戶不需要知道根據原材料構建產品的詳細過程,並可以方便的增加新的產品。
三.適用性
- 當創建複雜對象的演算法應該獨立於該對象的組成部分以及它們的裝配方式時。
- 當構造過程必須允許被構造的對象有不同的表示時。
四.類圖
如以上類圖所示,Director只負責組建整個流程,並不關心組建的具體過程,組建的細節由每一個Bulider負責。
五.實例代碼
#include "Builder.h" #include "Product.h" #include <iostream> #include <cstdlib> #include <cstdio> class Director { public: Builder* m_builder; Product * m_product; Director(Builder*builder) : m_builder(builder) { } void ParseElement(int element) { switch (element) { case 1: m_builder->BuildHouse(); break; case 2: m_builder->BuildHouse(); break; case 3: m_builder->BuildHouse(); } } Product * GetProduct() { m_product = m_builder->GetProduct(); return m_product; } };Director.h
#include "Builder.h" #include "Product.h" #include <iostream> #include <cstdlib> #include <cstdio> class Director { public: Builder* m_builder; Product * m_product; Director(Builder*builder) : m_builder(builder) { } void ParseElement(int element) { switch (element) { case 1: m_builder->BuildHouse(); break; case 2: m_builder->BuildHouse(); break; case 3: m_builder->BuildHouse(); } } Product * GetProduct() { m_product = m_builder->GetProduct(); return m_product; } };Builder.h
#ifndef PRODUCT_H_ #define PRODUCT_H_ class Product { public: Product() { } }; class ProductA : Product { public: ProductA() { } }; class ProductB : Product { public: ProductB() { } }; class ProductC : Product { public: ProductC() { } }; #endifProduct.h
#include "Director.h" #include "Builder.h" void main() { Builder *builder = (Builder *)new BuilderA(); auto director = new Director(builder); director->ParseElement(1); director->ParseElement(2); director->ParseElement(3); auto product = director->GetProduct(); builder = (Builder *)new BuilderB(); director = new Director(builder); director->ParseElement(1); director->ParseElement(2); director->ParseElement(3); product = director->GetProduct(); builder = (Builder *)new BuilderC(); director = new Director(builder); director->ParseElement(1); director->ParseElement(2); director->ParseElement(3); product = director->GetProduct(); while(1); }Test Code
以上實例代碼,以建房子為例,其中材料用整數1,2,3模擬,代表不同的材料。Director為解析材料的工作人員。有BuliderA,BuliderB,BuliderC三位建築師,解析材料的工作人員把材料交給三位建築師後,將會建造出三種不同的房子。測試結果如下:
六.效果
- 可以改變一個產品的內部表示
- 將構造代碼和表示代碼分開
- 對構造過程進行更精細的控制。