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

    创建型模式 建造者模式

    1) Builder:为创建产品各个部分,统一抽象接口。
    2) ConcreteBuilder:具体的创建产品的各个部分,部分A, 部分B,部分C。
    3) Director:构造一个使用Builder接口的对象。
    4) Product:表示被构造的复杂对象。
            ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
            适用情况:一个对象的构建比较复杂,将一个对象的构建和对象的表示进行分离。

    /**
     * 创建型模式 建造者模式
     * Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。
     * Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。  
     * 对象的创建:Builder模式是为对象的创建而设计的模式- 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象
     * 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法
     *
     */
    
    #include <iostream>
    #include <string>
    
    
    // 表示被构造的复杂对象
    class House
    {
    public:
        void setFloor(std::string floor)
        {
            this->m_floor = floor;
        }
        void setWall(std::string wall)
        {
            this->m_wall = wall;
        }
        void setDoor(std::string door)
        {
            this->m_door = door;
        }
        std::string getFloor()
        {
            return m_floor;
        }
        std::string getWall()
        {
            return m_wall;
        }
        std::string getDoor()
        {
            return m_door;
        }
    
    private:
        std::string m_floor;
        std::string m_wall;
        std::string m_door;
    };
    
    // 设计师 为创建产品各个部分,统一抽象接口。
    class Builder
    {
    public:
        virtual void makeFloor() = 0;
        virtual void makeWall() = 0;
        virtual void makeDoor() = 0;
        virtual House * getHouse() = 0;
        virtual ~Builder() {}
    };
    
    // 公寓施工队
    class FlatBuild: public Builder
    {
    public:
        FlatBuild()
        {
            pHouse = new House;
        }
        ~FlatBuild()
        {
            delete pHouse;
            pHouse = nullptr;
        }
        virtual void makeFloor() override
        {
            pHouse->setFloor("Flat Floor");
        }
        virtual void makeWall() override
        {
            pHouse->setWall("Flat Wall");
        }
        virtual void makeDoor() override
        {
            pHouse->setDoor("Flat Door");
        }
        virtual House * getHouse() override
        {
            return pHouse;
        }
    private:
        House *pHouse;
    };
    
    // 别墅施工队
    class VillBuild: public Builder
    {
    public:
        VillBuild()
        {
            pHouse = new House;
        }
        ~VillBuild()
        {
            delete pHouse;
            pHouse = nullptr;
        }
        virtual void makeFloor() override
        {
            pHouse->setFloor("Vill Floor");
        }
        virtual void makeWall() override
        {
            pHouse->setWall("Vill Wall");
        }
        virtual void makeDoor() override
        {
            pHouse->setDoor("Vill Door");
        }
        virtual House * getHouse() override
        {
            return pHouse;
        }
    private:
        House *pHouse;
    };
    
    // 指挥者按照设计师的要求进行指挥
    // 依赖关系,依赖设计师
    class Director
    {
    public:
        void doConstruct(Builder * builder)
        {
            builder->makeFloor();
            builder->makeWall();
            builder->makeDoor();
        }
    };
    
    void mytest()
    {
        // 客户直接造房子
        House * pHouse = new House();
    
        pHouse->setFloor("diy floor");
        pHouse->setWall("diy wall");
        pHouse->setDoor("diy door");
        std::cout << pHouse->getFloor().c_str() << std::endl;
        std::cout << pHouse->getWall().c_str() << std::endl;
        std::cout << pHouse->getDoor().c_str() << std::endl;
        delete pHouse;
        pHouse = nullptr;
    
        // 指挥者按照设计师的要求进行指挥
        Director * director = new Director();
        Builder * builder = nullptr;
    
        builder = new FlatBuild();
        director->doConstruct(builder); // 指挥者指挥工程队施工
        pHouse = builder->getHouse();
        std::cout << pHouse->getFloor().c_str() << std::endl;
        std::cout << pHouse->getWall().c_str() << std::endl;
        std::cout << pHouse->getDoor().c_str() << std::endl;
        delete builder;
        builder = nullptr;
        pHouse = nullptr;
    
        builder = new VillBuild();
        director->doConstruct(builder); // 指挥者指挥工程队施工
        pHouse = builder->getHouse();
        std::cout << pHouse->getFloor().c_str() << std::endl;
        std::cout << pHouse->getWall().c_str() << std::endl;
        std::cout << pHouse->getDoor().c_str() << std::endl;
        delete builder;
        builder = nullptr;
        pHouse = nullptr;
    
        delete director;
        director = nullptr;
    
        return;
    }
    
    
    int main()
    {
        mytest();
    
        system("pause");
        return 0;
    }
  • 相关阅读:
    帧同步与状态同步的区别
    spread语法解析与使用
    CoordinatorLayout自定义Bahavior特效及其源码分析
    更便捷的Android多渠道打包方式
    用Dart&Henson玩转Activity跳转
    用RxJava处理复杂表单验证问题
    用RxJava处理嵌套请求
    技术与业务的抉择————论程序员的“瓶颈”问题
    Android Studio单元测试入门
    Android一键多渠道分发打包实战和解析
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/7775144.html
Copyright © 2011-2022 走看看