zoukankan      html  css  js  c++  java
  • 建造者模式

    1. 在C++中,如果在类的构造函数中调用虚函数时,使用的是静态绑定。
    2. 建造者模式让对象的表示与构建相分离。
    一、简介
    建造者模式是当创建复杂对象的流程应该独立与该对象的组成部分以及他们的装配方式时适用的模式。本模式使得同样的构建过程可以创建不同的对象。
    1. 优点:
    1)隔离了构建的步骤和具体的实现,为产品的具体实现提供了灵活度。
    2)封装和抽象了每个步骤的实现,实现了依赖倒转原则。
    3)封装了具体的步骤,减少了代码的冗余。
    2. 缺点:
    1)要求构建产品的步骤(算法)是不能剧烈变化的,最好是不变的,这样就影响了灵活度。
    二、结构图
    以下为一张经典的建造者模式的结构类图:

     

      在图中,可以看到具体产品的建造顺序作为不变的部分,被封装在建造者的虚接口中,但是复杂多变的构建可以通过多态去处理。

    三、示例

    #ifndef Builder_h
    #define Builder_h
    
    class Car
    {
    public:
        Car();
        virtual ~Car() {};
    
        void            addWheel();
        void            addBody();
        void            addEngine();
    
        void            drive();
    };
    
    class BaseBuilder
    {
    public:
        BaseBuilder();
        virtual ~BaseBuilder();
    
        virtual            addCarWheel();
        virtual            addCarBody();
        virtual            addCarEngine();
    
        virtual Car        getCar();
    
    private:
    
    };
    
    class BMWCarBuilder : public BaseBuilder
    {
    public:
        BMWCarBuilder() 
            : m_car(new Car)
        {};
        virtual ~BMWCarBuilder() {};
    
        virtual            addCarWheel() 
        {
            m_car->addWheel();
        };
    
        virtual            addCarBody()
        {
            m_car->addBody();
        };
    
        virtual            addCarEngine()
        {
            m_car->addEngine();
        };
    
        virtual Car        getCar() { return (*m_car); };
    
    private:
        Car            *m_car;
    };
    
    class QQCarBuilder : public BaseBuilder
    {
    public:
        QQCarBuilder();
        virtual ~QQCarBuilder();
    
        virtual            addCarWheel()
        {
            m_car->addWheel();
        };
    
        virtual            addCarBody()
        {
            m_car->addBody();
        };
    
        virtual            addCarEngine()
        {
            m_car->addEngine();
        };
    
        virtual Car        getCar() { return (*m_car); };
    private:
        Car            *m_car;
    };
    
    class BuilderManager
    {
    public:
        BuilderManager();
        virtual ~BuilderManager() {};
    
        void            productCar(BaseBuilder *builder)
        {
            if (nullptr != builder)
            {
                builder->addCarBody();
                builder->addCarWheel();
                builder->addCarEngine();
            }
        };
    };
    
    void main()
    {
        BuilderManager manager;
        BMWCarBuilder *bmwBuilder = new BMWCarBuilder;
        QQCarBuilder *qqBuilder = new QQCarBuilder;
    
        manager.productCar(bmwBuilder);
        manager.productCar(qqBuilder);
    
        Car bmwCar = bmwBuilder->getCar();
        Car qqCar = qqBuilder->getCar();
    
        delete bmwBuilder;
        bmwBuilder = nullptr;
    
        delete qqBuilder;
        qqBuilder = nullptr;
    }
    #endif // !Builder_h
  • 相关阅读:
    Hystrix服务降级
    postman使用教程12-预处理(pre-request) 发送请求
    postman使用教程11- sign 签名预处理(pre-request)
    postman使用教程10-请求前参数预处理(pre-request)
    postman使用教程9-点 code 按钮生成代码段
    postman使用教程8-设置断言(Tests脚本编写)
    postman使用教程7-参数化引用外部文件(txt/csv/json)测试数据
    postman使用教程6-引用随机变量($guid,$timestamp,$randomInt)
    postman使用教程5-Test脚本中自定义变量(参数关联 提取 token 和引用 token )
    postman使用教程4-集合变量(collection variables)的使用
  • 原文地址:https://www.cnblogs.com/yuemw/p/10224733.html
Copyright © 2011-2022 走看看