zoukankan      html  css  js  c++  java
  • 【设计模式】建造者模式

    建造者模式:将复杂对象的建造过程抽象出来。使这个抽象过程的不同实现方法能够构造出不同属性的对象。当构造一个对象时,构造的流程是同样的,但每个步骤相应的详细操作是有差异的。

    这时。能够将须要进行的初始化作为虚函数固定到一个抽象基类中,这个抽象基类称为抽象建造者类;而详细的实现则由派生类中重写的虚函数定义,这个派生类称为详细建造者类。有了详细的建造步骤,下一步就是要按顺序调用这些步骤,这是由一个称为指挥者类来管理的。建造者模式的UML图例如以下:


    以下用一个C++程序模拟建造者模式。

    #include <iostream>
    #include <string>
      
    using namespace std;
     
    // Product类
    class PC {
    public:
        // 打印配置
        void Display()
        {
            cout << "CPU : " << cpu << endl;
            cout << "Memory : " << memory << endl;
            cout << "Harddisk : " << harddisk << endl;
        }
        // 一台PC所需的设备
        string cpu;
        string memory;
        string harddisk;
    };
      
    // 抽象建造者类
    class PCBuilder {
    public:
        virtual void BuildCPU() = 0;
        virtual void BuildMemory() = 0;
        virtual void BuildHardDisk() = 0;
        virtual const PC& GetPC() = 0;
    };
      
    // 详细建造者类:第一种组合配置
    class ConcreteBuilder1 : public PCBuilder {
    public:
        void BuildCPU()
        {
            pc.cpu = "英特尔";
        }
        void BuildMemory()
        {
            pc.memory = "金士顿";
        }
        void BuildHardDisk()
        {
            pc.harddisk = "希捷";
        }
        const PC& GetPC()
        {
            return pc;
        }
    private:
        PC pc;  // 保存须要被构造的实体
    };
      
    // 详细建造者类:另外一种组合配置
    class ConcreteBuilder2 : public PCBuilder {
    public:
        void BuildCPU()
        {
            pc.cpu = "AMD";
        }
        void BuildMemory()
        {
            pc.memory = "威刚";
        }
        void BuildHardDisk()
        {
            pc.harddisk = "日立";
        }
        const PC& GetPC()
        {
            return pc;
        }
    private:
        PC pc;  // 保存须要被构造的实体
    };
      
    // 指挥类,负责安排某个对象的构造流程
    class Director {
    public:
        void Build(PCBuilder *builder)
        {
            builder->BuildCPU();
            builder->BuildMemory();
            builder->BuildHardDisk();
        }
    };
      
    int main()
    {
        Director director;
        PCBuilder *builder1 = new ConcreteBuilder1();
        PCBuilder *builder2 = new ConcreteBuilder2();
      
        director.Build(builder1);
        director.Build(builder2);
      
        PC pc1 = builder1->GetPC();
        pc1.Display();
      
        cout << endl;
      
        PC pc2 = builder2->GetPC();
        pc2.Display();
      
        system("pause");
        return 0;
    }

    执行结果:


    组装一台PC的全部步骤都包括在抽象基类PCBuilder中,它仅仅包括一些接口,详细的实如今派生类中定义。ConcreteBuilder1和ConcreteBuilder2分别代表了两种配置,所以它们对虚函数的重写内容都不同样。这里须要注意,详细建造者类中包括了须要被构造出来的对象,这个对象被称为Product。

    有了不同的配置,接下来就须要定义一个指挥者类对PC的组装过程进行安排。在这个样例中,指挥者类是Director。

    当用户代码使用指挥者类对准备好的配置进行组装时。会严格依照Director对象中的步骤进行组装,组装的细节对用户是透明的。建造者模式主要用于创建一些复杂的对象。这些对象的构造顺序一般是稳定的,但内部的表示却各不同样。

    将复杂的构造操作封装在类中,使得用户在实例化一个对象时。不会由于遗漏某些步骤而导致建造不完整的情况。

    參考:

    《大话设计模式》第13章

  • 相关阅读:
    【编译原理】文法解析算法以及左递归消除算法
    【编译原理】 DFA词法分析和递归下降语法分析代码
    编译原理 第三章 词法分析(下)
    详解KMP算法
    编译原理 第三章 词法分析(上)
    ExtJs4.0入门错误
    致好友的一封信
    解析Xml四种方法
    Spring AOP实现原理
    Spring Ioc知识整理
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6840250.html
Copyright © 2011-2022 走看看