【设计模式】建造者模式

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

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

posted @ 2017-05-11 11:54  zsychanpin  阅读(135)  评论(0编辑  收藏  举报