[创建型模式] Builder

Product.h

//
//  Product.h
//  Builder
//
//  Created by Cheney Shen on 11-2-20.
//  Copyright 2011年 __MyCompanyName__. All rights reserved.
//

#ifndef _PRODUCT_H_
#define _PRODUCT_H_

class Product
{
    public:
    Product();
    
    ~Product();
    
    void ProducePart();
    
    protected:
    
    private:
    
};

class ProductPart
{
    public:
    ProductPart();
    
    ~ProductPart();
    
    ProductPart* BuildPart();
    
    protected:
    
    private:
    
};

#endif  //~_PRODUCT_H_

Product.cpp

//
//  Product.cpp
//  Builder
//
//  Created by Cheney Shen on 11-2-20.
//  Copyright 2011年 __MyCompanyName__. All rights reserved.
//

#include "Product.h"

Product::Product()
{
    
}

Product::~Product()
{
    
}

ProductPart::ProductPart()
{
    
}

ProductPart::~ProductPart()
{
    
}

Builder.h

//
//  Builder.h
//  Builder
//
//  Created by Cheney Shen on 11-2-20.
//  Copyright 2011年 __MyCompanyName__. All rights reserved.
//

#ifndef _BUILDER_H
#define _BUILDER_H

#include <string>
using namespace std;

class Product;
class Builder
{
    public:
    virtual ~Builder();
    virtual void BuildPartA(const string& buildPara)=0;
    virtual void BuildPartB(const string& buildPara)=0;
    virtual void BuildPartC(const string& buildPara)=0;
    virtual Product* GetProduct()=0;
    
    protected:
    Builder();
    
    private:
    
};

class ConcreteBuilder: public Builder
{
    public:
    ConcreteBuilder();
    ~ConcreteBuilder();
    void BuildPartA(const string& buildPara);
    void BuildPartB(const string& buildPara);
    void BuildPartC(const string& buildPara);
    Product* GetProduct();
    
    protected:
    
    private:
    
};

#endif  //~_BUILDER_H

Builder.cpp

//
//  Builder.cpp
//  Builder
//
//  Created by Cheney Shen on 11-2-20.
//  Copyright 2011年 __MyCompanyName__. All rights reserved.
//

#include "Builder.h"
#include "Product.h"
#include <iostream>
using namespace std;

Builder::Builder()
{
    
}

Builder::~Builder()
{
    
}

ConcreteBuilder::ConcreteBuilder()
{
    
}

ConcreteBuilder::~ConcreteBuilder()
{
    
}

void ConcreteBuilder::BuildPartA(const string& buildPara)
{
    cout<<"Step1:BuildPartA..."<<buildPara<<endl;
}

void ConcreteBuilder::BuildPartB(const string& buildPara)
{
    cout<<"Step2:BuildPartB..."<<buildPara<<endl;
}

void ConcreteBuilder::BuildPartC(const string& buildPara)
{
    cout<<"Step3:BuildPartC..."<<buildPara<<endl;
}

Product* ConcreteBuilder::GetProduct()
{
    BuildPartA("pre-defined");
    BuildPartB("pre-defined");
    BuildPartC("pre-defined");
    return new Product();
}

Director.h

//
//  Director.h
//  Builder
//
//  Created by Cheney Shen on 11-2-20.
//  Copyright 2011年 __MyCompanyName__. All rights reserved.
//

#ifndef _DIRECTOR_H_
#define _DIRECTOR_H_

class Builder;
class Director
{
    public:
    Director(Builder* hld);
    ~Director();
    void Construct();
    
    protected:
    
    private:
    Builder* _bld;
};

#endif  //~_DIRECTOR_H_

Director.cpp

//
//  Director.cpp
//  Builder
//
//  Created by Cheney Shen on 11-2-20.
//  Copyright 2011年 __MyCompanyName__. All rights reserved.
//

#include "Director.h"
#include "Builder.h"

Director::Director(Builder* bld)
{
    _bld = bld;
}

Director::~Director()
{
    
}

void Director::Construct()
{
    _bld->BuildPartA("user-defined");
    _bld->BuildPartB("user-defined");
    _bld->BuildPartC("user-defined");
}

main.cpp

//
//  main.cpp
//  Builder
//
//  Created by Cheney Shen on 11-2-20.
//  Copyright 2011年 __MyCompanyName__. All rights reserved.
//

#include "Builder.h"
#include "Product.h"
#include "Director.h"
#include <iostream>
using namespace std;

int main (int argc, const char * argv[]) {

    Director* d = new Director(new ConcreteBuilder());
    
    d->Construct();
    
    return 0;
}
原文地址:https://www.cnblogs.com/shenfei2031/p/1979305.html