首页 > 代码库 > 【设计模式】建造者模式
【设计模式】建造者模式
建造者模式:将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同属性的对象。当构造一个对象时,构造的流程是相同的,但每一个步骤对应的具体操作是有差异的。这时,可以将需要进行的初始化作为虚函数固定到一个抽象基类中,这个抽象基类称为抽象建造者类;而具体的实现则由派生类中重写的虚函数定义,这个派生类称为具体建造者类。有了具体的建造步骤,下一步就是要按顺序调用这些步骤,这是由一个称为指挥者类来管理的。下面用一个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章
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。