建造者模式 c++

建造者模式
定义: 也叫生成器模式,将一个复杂的对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
如果有多个产品类就有几个具体的建造者,而且这多个产品类具有相同的接口或抽象类。
导演类起到封装作用,当建造者模式比较大时,导演类可以有多个。
类图:
这里写图片描述
Product产品类:
通常实现了模板方法模式,也就是有模板方法和基本方法.
Builder抽象建造者:
规范产品的组建,一般由子类实现。
ConcreteBulider具体建造者:
实现抽象类的定义的所有方法,并返回一个组建好的对象。
Director 指导类:
负责安排已有模块的顺序,然后调用Bulider开始建造。

建造者优点:
1).客户端不必知道内部实现
2).建造者独立,容易扩展
3).具体见到这是独立的,可以对建造过程逐步细化,而不对其他模块产生影响。

使用场景:
1).相同方法,不同执行顺序,产生不同的事件结果。
2).多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同
3).产品类非常复杂,或者产品类的调用顺序不同产生不同的效能
4).对象使用过程中会使用到系统中的其他对象

建造者模式扩展:
对建造者模式引入模板方法模式

建造者模式与工厂模式:
建造者模式 工厂模式
主要注重调用基本方法的顺序安排,也就是基本方法实现了,也就是零件的装配,顺序不同产生的对象也不同,(顺序不同产生对象不同) 主要重点是创建,创建零件是他的职责,组装顺序不关心

题示:
宝马车奔驰车模型用户随时可能要求更改 指导类只制造了四个模型

这里写图片描述

代码:

#include <iostream>
#include <vector>
#include <string>
using namespace std;
typedef  vector<string>   ArrayList;
//车辆模型抽象类
class CarModel
{
private:
     ArrayList sequence  =  ArrayList();
protected:
    virtual void start() = 0;
    virtual void stop() = 0;
    virtual void alarm() = 0;
    virtual void engineBoom() = 0;
    public :
    virtual  void run()  final
    {
        for(unsigned int i = 0 ; i <sequence.size(); i++)
        {
            string actionName = sequence[i];
            if(actionName == "start")
                this->start();
            if(actionName == "stop")
                this->stop();
            if(actionName == "alarm")
                this->alarm();
            if(actionName == "engine Boom")
                this->engineBoom();
        }
    }
    public:
    virtual  void setSequence(ArrayList sequence) final
    {
        this->sequence = sequence;
    }
};
//奔驰模型
class BenzModel:public CarModel
{
protected:
    void alarm()
    {
        cout<<"奔驰车的喇叭声是这样的"<<endl;
    }
    void engineBoom()
    {
        cout<<"奔驰车的引擎是这个声音"<<endl;
    }
    void start()
    {
        cout<<"奔驰车跑起来是这个声音"<<endl;
    }
    void stop()
    {
        cout<<"奔驰车应该是这样停车的"<<endl;
    }
};
//宝马模型
class BMWModel:public CarModel
{
protected:
    void alarm()
    {
        cout<<"宝马车的喇叭声是这样的"<<endl;
    }
    void engineBoom()
    {
        cout<<"宝马车的引擎是这个声音"<<endl;
    }
    void start()
    {
        cout<<"宝马车跑起来是这个声音"<<endl;
    }
    void stop()
    {
        cout<<"宝马车应该是这样停车的"<<endl;
    }
};
//抽象汽车组装者
class CarBuilder
{
public:
   virtual void setSequence(ArrayList sequence) = 0;//建造模型 要给组装顺序
   virtual CarModel* getCarModel() = 0 ;//顺序设置完毕,就可以拿到这个车辆模型
};
//奔驰组装者
class BenzBuilder : public CarBuilder
{
private:
    BenzModel benz = BenzModel();
public:
    CarModel* getCarModel()
    {
        return &(this->benz);
    }
    void setSequence(ArrayList sequence)
    {
        this->benz.setSequence(sequence);
    }
};
//宝马组装者
class BMWBuilder : public CarBuilder
{
private:
    BMWModel bmw = BMWModel();
public:
    CarModel* getCarModel()
    {
        return &(this->bmw);
    }
    void setSequence(ArrayList sequence)
    {
        this->bmw.setSequence(sequence);
    }
};
//导演类 只制造了4个模型
class Director
{
private :
    ArrayList sequence  = ArrayList();
    BenzBuilder benzbuilder =  BenzBuilder();
    BMWBuilder  bmwbuilder  =  BMWBuilder();
    /*四个模型*/
public:
    BenzModel getABenzModel()
    {
        /*清理现场*/
        this->sequence.clear();
        this->sequence.push_back("start");
        this->sequence.push_back("stop");
        this->benzbuilder.setSequence(this->sequence);
         CarModel  * car(this->benzbuilder.getCarModel());
         return   *(dynamic_cast<BenzModel*>(car));
    }
    BenzModel getBBenzModel()
    {
        /*清理现场*/
        this->sequence.clear();
        this->sequence.push_back("engine boom");
        this->sequence.push_back("start");
        this->sequence.push_back("stop");
        this->benzbuilder.setSequence(this->sequence);
        CarModel  * car(this->benzbuilder.getCarModel());
        return   *(dynamic_cast<BenzModel*>(car));
    }
     BMWModel getCBMWModel()
    {
        /*清理现场*/
        this->sequence.clear();
        this->sequence.push_back("alarm");
        this->sequence.push_back("start");
        this->sequence.push_back("stop");
        this->bmwbuilder.setSequence(this->sequence);
        CarModel  * car(this->bmwbuilder.getCarModel());
        return   *(dynamic_cast<BMWModel*>(car));
    }
    BMWModel getDBMWModel()
    {
        /*清理现场*/
        this->sequence.clear();
        this->sequence.push_back("alarm");
        this->sequence.push_back("start");
        this->bmwbuilder.setSequence(this->sequence);
        CarModel  * car(this->bmwbuilder.getCarModel());
        return   *(dynamic_cast<BMWModel*>(car));
    }
};
int main()
{
    Director dircetor = Director();
    //2俩A类型奔驰车
 for(int i = 0 ; i < 2 ; i++)
    {
        dircetor.getABenzModel().run();
    }
     for(int i = 0 ; i < 2 ; i++)
    {
        dircetor.getCBMWModel().run();
    }
    return 0;
    return 0;
}
结果:
奔驰车跑起来是这个声音
奔驰车应该是这样停车的
奔驰车跑起来是这个声音
奔驰车应该是这样停车的
宝马车的喇叭声是这样的
宝马车跑起来是这个声音
宝马车应该是这样停车的
宝马车的喇叭声是这样的
宝马车跑起来是这个声音
宝马车应该是这样停车的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的建造者模式C++ 示例代码: ```c++ #include <iostream> #include <string> using namespace std; // 产品类 class Product { public: void setPartA(string partA) { m_partA = partA; } void setPartB(string partB) { m_partB = partB; } void setPartC(string partC) { m_partC = partC; } void show() { cout << m_partA << " " << m_partB << " " << m_partC << endl; } private: string m_partA; string m_partB; string m_partC; }; // 抽象建造者类 class Builder { public: virtual void buildPartA() = 0; virtual void buildPartB() = 0; virtual void buildPartC() = 0; virtual Product* getProduct() = 0; }; // 具体建造者类 class ConcreteBuilder : public Builder { public: ConcreteBuilder() { m_product = new Product(); } void buildPartA() { m_product->setPartA("PartA"); } void buildPartB() { m_product->setPartB("PartB"); } void buildPartC() { m_product->setPartC("PartC"); } Product* getProduct() { return m_product; } private: Product* m_product; }; // 指挥者类 class Director { public: void setBuilder(Builder* builder) { m_builder = builder; } Product* construct() { m_builder->buildPartA(); m_builder->buildPartB(); m_builder->buildPartC(); return m_builder->getProduct(); } private: Builder* m_builder; }; int main() { Director director; ConcreteBuilder concreteBuilder; director.setBuilder(&concreteBuilder); Product* product = director.construct(); product->show(); delete product; return 0; } ``` 在上面的代码中,Product 类表示要建造的产品,Builder 类是抽象建造者类,定义了建造产品的抽象方法,ConcreteBuilder 类是具体建造者类,实现了 Builder 类中定义的抽象方法,并返回 Product 对象,Director 类是指挥者类,用于指挥建造过程的顺序。在 main() 函数中,我们首先创建了一个 ConcreteBuilder 对象,然后通过 Director 类来完成建造过程,并最终获得了建造完成的 Product 对象并输出其属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值