zoukankan      html  css  js  c++  java
  • 设计模式-Builder模式(创建型模式)

    //以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码

    //Product.h

    #pragma once
    class Product {
    public:
        Product();
        ~Product();
        void ProducePart();
    protected:
    private:
    };
    
    class ProductPart {
    public:
        ProductPart();
        ~ProductPart();
        ProductPart* buildPart();
    protected:
    private:
    
    };

    //Product.cpp

    #include"Product.h"
    #include<iostream>
    
    Product::Product()
    {
        ProducePart();
        std::cout << "return a Product." << std::endl;
    }
    Product::~Product()
    {
    
    }
    void Product::ProducePart()
    {
        std::cout << "Build part of product." << std::endl;
    }
    
    ProductPart::ProductPart(){}
    ProductPart::~ProductPart(){}
    ProductPart* ProductPart::buildPart()
    {
        return new ProductPart;
    }

    //Build.h

    #pragma once
    #include<string>
    class Product;
    class Builder {
    public:
        virtual ~Builder();
        virtual void BuildPartA(const std::string& buildPara) = 0;
        virtual void BuildPartB(const std::string& buildPara) = 0;
        virtual void BuildPartC(const std::string& buildPara) = 0;
        virtual Product* getProduct() = 0;
    protected:
        Builder();
    private:
    };
    
    class ConcreateBuilder :public Builder {
    public:
        ConcreateBuilder();
        virtual ~ConcreateBuilder();
        void BuildPartA(const std::string& buildPara);
        void BuildPartB(const std::string& buildPara);
        void BuildPartC(const std::string& buildPara);
        Product* getProduct();
    protected:
    private:
    };

    //Build.cpp

    #include"Build.h"
    #include"Product.h"
    #include<iostream>
    
    Builder::Builder(){}
    Builder::~Builder(){}
    ConcreateBuilder::ConcreateBuilder(){}
    ConcreateBuilder::~ConcreateBuilder(){}
    void ConcreateBuilder::BuildPartA(const std::string& buildPara)
    {
        std::cout << "Step1: Build Part1...." << buildPara << std::endl;
    }
    void ConcreateBuilder::BuildPartB(const std::string& buildPara)
    {
        std::cout << "Step2: Build Part2..." << buildPara << std::endl;
    }
    void ConcreateBuilder::BuildPartC(const std::string& buildPara)
    {
        std::cout << "Step3: Build Part3..." << buildPara << std::endl;
    }
    Product* ConcreateBuilder::getProduct()
    {
        BuildPartA("Pre-Defined");
        BuildPartB("Pre-Defined");
        BuildPartC("Pre-Defined");
        return new Product();
    }

    //Director.h

    #pragma once
    class Builder;
    class Director {
    public:
        ~Director();
        Director(Builder* bld);
        void Construct();
    protected:
    private:
        Builder* _bld;
    };

    //Director.cpp

    #include"Director.h"
    #include"Build.h"
    
    Director::~Director()
    {
    
    }
    Director::Director(Builder* bld)
    {
        _bld = bld;
    }
    void Director::Construct()
    {
        _bld->BuildPartA("User-Defined");
        _bld->BuildPartB("User-Defined");
        _bld->BuildPartC("User-Defined");
    }

    //main.cpp

    #include"Build.h"
    #include"Director.h"
    #include"Product.h"
    
    int main(int args, char* argv)
    {
        Director* dir = new Director(new ConcreateBuilder());
        dir->Construct();
    
        return 0;
    }
  • 相关阅读:
    GZOI 2017配对统计 树状数组
    关于线段树的一些问题
    BZOJ 压力 tarjan 点双联通分量+树上差分+圆方树
    洛谷4552 差分
    洛谷5026 Lycanthropy 差分套差分
    【锁】MySQL和Oracle行锁比较
    oracle体系结构
    【加密】RSA验签及加密
    【Shiro】SpringBoot集成Shiro
    【Eureka】实现原理
  • 原文地址:https://www.cnblogs.com/fourmi/p/12075149.html
Copyright © 2011-2022 走看看