0
点赞
收藏
分享

微信扫一扫

设计模式-创建型-生成器

#pragma once

#ifndef BUILDER_H
#define BUILDER_H

#include <memory>
using namespace std;
// 虚拟基类,是所有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:
auto_ptr<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


#include "StdAfx.h"
#include "builder_impl.h"

#include <iostream>
using namespace std;
void ConcreateBuilder1::BuilderPartA()
{
std::cout<<" BuilderPartA by ConcreateBuilder1:"<<this<<endl;
}

void ConcreateBuilder1::BuilderPartB()
{
std::cout<<" BuilderPartB by ConcreateBuilder1:"<<this<<endl;
}

void ConcreateBuilder2::BuilderPartA()
{
std::cout<<" BuilderPartA by ConcreateBuilder2:"<<this<<endl;
}

void ConcreateBuilder2::BuilderPartB()
{
std::cout<<" BuilderPartB by ConcreateBuilder2:"<<this<<endl;
}

Director::Director(Builder * pBuilder)
: m_pBuilder(pBuilder)
{
}

Director:: ~Director()
{
}

// Construct 函数表示一个对象的整个构建过程,不同的部分之间的装配方式都是一致的,
// 首先构建PartA 其次是PartB,只是根据不同的构建者会有不同的表示
void Director::Construct()
{
m_pBuilder -> BuilderPartA();
m_pBuilder -> BuilderPartB();
}


// Builder.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include "builder_impl.h"
#include <stdlib.h>
#include <memory>
// 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//构建过程一样,根据装载builder1和builder2创建不同表示
auto_ptr<Director> pDirector1(new Director(new ConcreateBuilder1));
pDirector1->Construct();

auto_ptr<Director> pDirector2(new Director(new ConcreateBuilder2));
pDirector2->Construct();

system( " pause " );

return 0;
}


举报

相关推荐

0 条评论