Builder

#include <iostream>

using namespace std;


#define DESTROY_POINTER(ptr) if (ptr) { delete ptr; ptr = NULL; }


class Builder
{
public:
    virtual ~Builder() {}

    virtual void Welcome()=0;
    virtual void City()=0;
    virtual void End()=0;
    
protected:
    Builder() {}
};


class ConcreteBuilderA : public Builder
{
public:
    ConcreteBuilderA() {}
    virtual ~ConcreteBuilderA() {}

    virtual void Welcome();
    virtual void City();
    virtual void End();
};

class ConcreteBuilderB : public Builder
{
public:
    ConcreteBuilderB() {}
    virtual ~ConcreteBuilderB() {}

    virtual void Welcome();
    virtual void City();
    virtual void End();
};

class Director
{
public:
    Director(Builder* pBuilder) : m_pBuilder(pBuilder) {}
    virtual ~Director() { DESTROY_POINTER(m_pBuilder); }

    void Create();
    
private:
    Builder* m_pBuilder;
};


void ConcreteBuilderA::Welcome()
{
    cout<<"welcome";
}

void ConcreteBuilderA::City()
{
    cout<<" China";
}

void ConcreteBuilderA::End()
{
    cout<<"!"<<endl;
}

void ConcreteBuilderB::Welcome()
{
    cout<<"welcome";
}

void ConcreteBuilderB::City()
{
    cout<<" Great China";
}

void ConcreteBuilderB::End()
{
    cout<<"!\n"<<flush;
}


void Director::Create()
{
    m_pBuilder->Welcome();
    m_pBuilder->City();
    m_pBuilder->End();
}







int main(int argc, char *argv[])
{
    Director director(new ConcreteBuilderA);
    director.Create();


    return 0;
}

 

posted @ 2014-12-09 11:12  stanley19861028  阅读(160)  评论(0编辑  收藏  举报