builder建造者模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Builder:这个基类是全部创建过程的抽象,提供构建不同组成部分的接口函数
BuildPartA,BuildPartB:是对一个对象不同部分的构建函数接口,Builder的派生类来具体实现。
Director::Construct():这个函数里面通过调研上面的两个接口函数完成对象的构建,也就是说各个不同部分装配的过程都是一致的(同样的调用Construct()),但是不同的构建方式会有不同的表示(根据builder的实际类型来决定如何构建,也就是多态)
解析:builder模式是基于这样一个情况:一个对象可能有不同的组成部分,这几个组成部分的不同的创建会有不同的表示,但是各个部分之间装配的方式是一致的。
应用实例:比方说一辆轿车都是由4车轮和发动机等构成的(一个对象不同的组成部分),不同的品牌(奔驰、宝马)生产出来的也不一样(不同的构建方式)。虽然不同的品牌构建出来的轿车不同,但是构建的过程还是一样的。也就是说,Director::Construct函数中固定了各个组成部分的装配方式,而具体是装配怎样的组成部分是由Builder的派生类实现的。
小demo
builder.h
#ifndef BUILDER_H #define BUILDER_H // 虚拟基类,是所有Builder的基类,提供不同部分的构建接口函数 class Builder { public: Builder(){}; virtual ~Builder(){} // 纯虚函数,提供构建不同部分的构建接口函数 virtual void BuilderPartA() = 0; virtual void BuilderPartB() = 0; }; // 使用Builder构建产品,构建产品的过程都一致,但是不同的builder有不同的实现 // 这个不同的实现通过不同的Builder派生类来实现,存有一个Builder的指针,通过这个来实现多态调用 class Director { public: Director(Builder* pBuilder); ~Director(); void Construct(); private: Builder* m_pBuilder; }; // Builder的派生类,实现BuilderPartA和BuilderPartB接口函数 class ConcreateBuilder1 : public Builder { public: ConcreateBuilder1(){} virtual ~ConcreateBuilder1(){} virtual void BuilderPartA(); virtual void BuilderPartB(); }; // Builder的派生类,实现BuilderPartA和BuilderPartB接口函数 class ConcreateBuilder2 : public Builder { public: ConcreateBuilder2(){} virtual ~ConcreateBuilder2(){} virtual void BuilderPartA(); virtual void BuilderPartB(); }; #endif
builder.cpp
#include "Builder.h" #include <iostream> void ConcreateBuilder1::BuilderPartA() { std::cout << "BuilderPartA by ConcreateBuilder1\n"; } void ConcreateBuilder1::BuilderPartB() { std::cout << "BuilderPartB by ConcreateBuilder1\n"; } void ConcreateBuilder2::BuilderPartA() { std::cout << "BuilderPartA by ConcreateBuilder2\n"; } void ConcreateBuilder2::BuilderPartB() { std::cout << "BuilderPartB by ConcreateBuilder2\n"; } Director::Director(Builder* pBuilder) : m_pBuilder(pBuilder) { } Director::~Director() { delete m_pBuilder; m_pBuilder = NULL; } // Construct函数表示一个对象的整个构建过程,不同的部分之间的装配方式都是一致的, // 首先构建PartA其次是PartB,只是根据不同的构建者会有不同的表示 void Director::Construct() { m_pBuilder->BuilderPartA(); m_pBuilder->BuilderPartB(); }
main.cpp
#include "Builder.h" #include <stdlib.h> int main() { Builder* pBuilder1 = new ConcreateBuilder1; Director *pDirector1 = new Director(pBuilder1); pDirector1->Construct(); Builder* pBuilder2 = new ConcreateBuilder2; Director *pDirector2 = new Director(pBuilder2); pDirector2->Construct(); delete pDirector1; delete pDirector2; system("pause"); return 0; }
Builder模式和AbstractFactory模式在功能上很相似,因为都是用来创建大的复杂的对象,它们的区别是:builder模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的结果对象,一般来说builder模式中对象不是直接返回的。而在AbstractFactory模式中对象是直接返回的,AbstractFactory模式强调的是为创建多个相互依赖的对象提供一个同一的接口。
适用于:
1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
2.当构造过程必须允许被构造的对象有不同表示时