建造者模式(C++)

建造者模式(C++)

  建造者模式:将复杂的对象的表示和它的实现相分离,使其在同样的构建下可以构建不通的表示。

  上面的话可能不是很明白,举个例子就明白了。假设一个公司的软件项目流程是固定的,都需要经过需求理解、需求设计、需求审核、编码、测试这个五个步骤,但是这个公司是一个一级供应商,在拿到项目后,有些模块需要承包给二级供应商,如HMI、Media两个模块需求外包出去,但是根据项目要求,所有模块(包括外包出去的模块)必须要实施需求理解、需求设计、需求审核、编码、测试这个基本步骤。

  如果这个用面向对象表示出来,那我们可以这样设计,设计一个项目类,包含需求理解、需求设计、需求审核、编码、测试这5个接口;其次设计一个抽象的供应商类,提供5个实现需求理解、需求设计、需求审核、编码、测试的方法,再设计一个HMI类和一个media类,并继承自供应商类,分别实现需求理解、需求设计、需求审核、编码、测试这5方法;最后定义一个公司类,公司类里面包含一个供应商类的变量,在公司类里定义一个做项目的方法,在这个方法里分别调用供应商类的需求理解、需求设计、需求审核、编码、测试就实现了。毕竟语言有点苍白,来看看UML类图吧:

再来看看代码就更明白:

#include <iostream>
#include <string>
using namespace std;

class Project  //项目类
{
public:
    Project():m_requirement(""), m_detailedDes(""), m_designRev(""), m_coding(""), m_test(""){}

    void requirementUnderstand(string str)//需求理解
    {
        cout<<" Project requirementUnderstand()"<<endl;
        m_requirement = str;
    }
    void detailedDesign(string str)//详细设计
    {
        cout<<" Project detailedDesign()"<<endl;
        m_detailedDes = str;
    }
    void designReview(string str)//设计核对
    {
        cout<<" Project designReview()"<<endl;
        m_designRev = str;
    }
    void coding(string str) //编码
    {
        cout<<" Project coding()"<<endl;
        m_designRev = str;
    }
    void test(string str) //测试
    {
        cout<<" Project test()"<<endl;
        m_designRev = str;
    }

private:
    string m_requirement;
    string m_detailedDes;
    string m_designRev;
    string m_coding;
    string m_test;

};


class Supplier//供应商基类,即二级供应商
{
public:
    virtual void implentRequirementUnderstand() = 0;//实现需求理解
    virtual void implentDetailedDesign() = 0;        //实现详细设计
    virtual void implentDeignReview() = 0;            //实现设计核对
    virtual void implentCoding() = 0;                //实现编码
    virtual void implentTest() = 0;                    //实现测试
    virtual ~Supplier(){}
};

class SupplierHMI : public Supplier//HMI供应商
{
public:
    SupplierHMI()
    {
        m_pro = new Project();
    }
    ~SupplierHMI()
    {
        if(NULL != m_pro)
        {
            delete m_pro;
            m_pro = NULL;
        }
    }
    virtual void implentRequirementUnderstand(void)
    {
        cout<<"SupplierHMI implentRequirementUnderstand()"<<endl;
        m_pro->requirementUnderstand("HMI requirementUnderstand");
    }
    virtual void implentDetailedDesign(void)
    {

        cout<<"SupplierHMI implentDetailedDesign() "<<endl;
        m_pro->detailedDesign("HMI detailedDesign" );
    }
    virtual void implentDeignReview(void)
    {
        cout<<"SupplierHMI implentDeignReview()"<<endl;
        m_pro->designReview("HMI designReview" );

    }
    virtual void implentCoding(void)
    {
        cout<<"SupplierHMIProject implentCoding()"<<endl;
        m_pro->coding("HMI coding");
    }
    virtual void implentTest(void)
    {
        cout<<"SupplierHMI implentTest()"<<endl;
        m_pro->test("HMI test");
    }
private:
    Project* m_pro;
};

class SupplierMedia : public Supplier//Media供应商
{
public:
    SupplierMedia()
    {
        m_pro = new Project();
    }
    ~SupplierMedia()
    {
        if(NULL != m_pro)
        {
            delete m_pro;
            m_pro = NULL;
        }
    }
    virtual void implentRequirementUnderstand(void)
    {
        cout<<"SupplierMedia implentRequirementUnderstand()"<<endl;
        m_pro->requirementUnderstand("Media requirementUnderstand");
    }
    virtual void implentDetailedDesign(void)
    {
        cout<<"SupplierMedia implentDetailedDesign() "<<endl;
        m_pro->detailedDesign("Media detailedDesign");
    }
    virtual void implentDeignReview(void)
    {
        cout<<"SupplierMedia implentDeignReview()"<<endl;
        m_pro->designReview("Media designReview");
    }
    virtual void implentCoding(void)
    {
        cout<<"SupplierMedia implentCoding()"<<endl;
        m_pro->coding("Media coding");
    }
    virtual void implentTest(void)
    {
        cout<<"SupplierMedia implentTest()"<<endl;
        m_pro->test("Media test");
    }
private:
    Project* m_pro;
};

class Company//公司,即一级供应商
{
private:
    Supplier* m_supplier;
public:
    Company(Supplier* sup):m_supplier(sup)
    {
    }
    ~Company()
    {
        if(NULL != m_supplier)
        {
            delete m_supplier;
            m_supplier = NULL;
        }
    }
    void doProject()//做这个项目
    {
        m_supplier->implentRequirementUnderstand();
        m_supplier->implentDetailedDesign();
        m_supplier->implentDeignReview();
        m_supplier->implentCoding();
        m_supplier->implentTest();
    }

};

int main(int argc, char** argv)
{
    Supplier* supplier = new SupplierHMI();
    Company company(supplier);
    company.doProject();
    return 0;
}

输出如下:

posted @ 2018-01-30 22:55 1点er执着 阅读( ...) 评论( ...) 编辑 收藏
建造者模式(Builder Pattern)是一种设计模式,用于将复杂产品的构建过程分解为一系列简单的步骤,使得每个步骤都可以独立地进行组合和测试。这个模式通常用于创建复杂的对象结构,尤其是当产品需要很多选项或配置的时候。 在 C++ 中,我们可以使用构造函数链或者工厂方法来实现建造者模式的一个简单例子: ```cpp // 定义一个抽象的构建者接口 class Builder { public: virtual Product* build() = 0; }; // 具体的产品 class ConcreteProduct { public: explicit ConcreteProduct(Builder& builder) : _builder(builder) {} // 实现一些产品特有的功能 void setFeature1(int value) { feature1_ = value; } void setFeature2(std::string value) { feature2_ = value; } private: int feature1_; std::string feature2_; Builder& _builder; }; // 具体的构建者 class ConcreteBuilderA : public Builder { public: ConcreteBuilderA() : _product(new ConcreteProduct(*this)) {} void configureFeature1(int value) { _product->setFeature1(value); } Product* build() override { return _product.release(); } private: std::unique_ptr<ConcreteProduct> _product; }; class ConcreteBuilderB : public Builder { public: void configureFeature2(const std::string& value) { _product->setFeature2(value); } Product* build() override { return _product.release(); } private: std::unique_ptr<ConcreteProduct> _product; }; int main() { Builder* builder = new ConcreteBuilderA(); builder->configureFeature1(42); builder = new ConcreteBuilderB(); // 改变构建者 builder->configureFeature2("example"); Product* product = builder->build(); delete builder; return 0; } ``` 在这个例子中,`Builder`是建造者的抽象接口,`ConcreteProduct`是产品,而`ConcreteBuilderA`和`ConcreteBuilderB`是具体的建造者,它们分别负责配置产品的一部分特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值