一.意图
将一个复杂对象的构建与它的表示分离,使得同样的构造过程可以创建不同的表示。
二.动机
一个复杂的对象的构造过程中,原料相同,可能会要求生产不同的产品,并且生产的产品种类还能够方便的增加。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; } };
#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; } };
#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() { } }; #endif
#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); }
以上实例代码,以建房子为例,其中材料用整数1,2,3模拟,代表不同的材料。Director为解析材料的工作人员。有BuliderA,BuliderB,BuliderC三位建筑师,解析材料的工作人员把材料交给三位建筑师后,将会建造出三种不同的房子。测试结果如下:
六.效果
- 可以改变一个产品的内部表示
- 将构造代码和表示代码分开
- 对构造过程进行更精细的控制。