Builder模式C++实现

作用:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表
示。
UML结构图:

Builder模式C++实现

 

适用于以下情况:

1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

2)当构造过程必须允许被构造的对象有不同的表示时。

抽象基类:

1)Builder:这个基类是全部创建对象过程的抽象,提供构建不同组成部分的接口

函数

接口:

1)Builder::BuildPartA,Builder::BuildPartB:是对一个对象不同部分的构建

函数接口,Builder的派生类来具体实现.

另外还有一个需要注意的函数,就是Director::Construct函数,这个函数里面

通过调用上面的两个接口函数完成对象的构建--也就是说各个不同部分装配的

过程都是一致的(同样的调用的Construct函数),但是不同的构建方式会有不同

的表示(根据Builder的实际类型来决定如何构建,也就是多态)

解析:

Builder模式是基于这样的一个情况:一个对象可能有不同的组成部分,这几个部

分的不同的创建对象会有不同的表示,但是各个部分之间装配的方式是一致的.

比方说一辆单车,都是由车轮车座等等的构成的(一个对象不同的组成部分),

同的品牌生产出来的也不一样(不同的构建方式).虽然不同的品牌构建出来的单

车不同,但是构建的过程还是一样的(,你见过车轮长在车座上的么?).

也就是说,Director::Construct函数中固定了各个组成部分的装配方式,而具体

是装配怎样的组成部分由Builder的派生类实现.

实现:

Builder模式的实现基于以下几个面向对象的设计原则:1)把变化的部分提取出

来形成一个基类和对应的接口函数,在这里不会变化的是都会创建PartA Par

tB,变化的则是不同的创建方法,于是就抽取出这里的Builder基类和BuildPart

A,BuildPartB接口函数 2)采用聚合的方式聚合了会发生变化的基类,就是这里

 

Director聚合了Builder类的指针.
1)Builder.h
/* ***********************************************************
********
created: 2006/07/19
filename: Builder.h
author: 李创
http://www.cppblog.com/converse/
purpose: Builder模式的演示代码
****************************************************************
**** */
#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
2)Builder.cpp
/* ***********************************************************
********
created: 2006/07/19
filename: Builder.cpp
author: 李创
http://www.cppblog.com/converse/
purpose: Builder模式的演示代码
****************************************************************
**** */
#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();
}
3)Main.cpp
/* ***********************************************************
********
created: 2006/07/20
filename: Main.cpp

 

author: 李创
http://www.cppblog.com/converse/
purpose: Builder模式的测试代码
****************************************************************
**** */
#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 ;
}

原文链接: https://www.cnblogs.com/weiqubo/archive/2011/01/09/1931504.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    Builder模式C++实现

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/19858

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午9:11
下一篇 2023年2月7日 下午9:12

相关推荐