用一个例子在表述抽象工厂和生成器的差异,备忘! 抽象工厂应用来生产一系列的对象,相当于配套产品 生成器用来组装各种部件使之成为一个整体 /* 抽象工厂(abstract factory)和生成器(builder) 抽象工厂用来生成对象 生成器用来生成和组装对象 使用这两种模式来模拟生产一台只有CPU的计算机 */ //首先定义 Computer、 CPU类. class CPU { }; class Computer { public: void Assembl(CPU* _cpu); private: CPU* _cpu; }; //定义一个CPU工厂(abstract factory),这个工厂生产整机,也生成配件件。 class CPUFactory { public: virtual CPU* CreateCPU() = 0;//CPU工厂一定要生成CPU要不然关门算了 }; //定义一个品牌机厂商(builder), 这个厂商自己会生成电脑配件,但他们更多的时候是从工厂处拿配件组装电脑,测试兼容性,然后出厂。 class ComputerBuilder { public: virtual void BulidComputer(){}; virtual Computer* GetComputer(){}; }; //定义AMD class AMDCPU : public CPU{}; class AMD : public CPUFactory { public: AMDCPU* CreateCPU() { return new AMDCPU(); } }; //定义Inter class IntelCPU : public CPU{}; class Intel : public CPUFactory { public: IntelCPU* CreateCPU() { return new IntelCPU(); } }; //定义DELL class DELLComputer : public Computer{}; class DELL : public ComputerBuilder { public: //生产一台只有CPU的电脑,这个factory可以是AMD也可以是Intel void BulidComputer() { _computer = new DELLComputer(); CPU* cpu = _factory->CreateCPU(); //装配电脑 _computer->Assembl(cpu); }; //出货(这个破电脑只有一个CPU...) Computer* GetComputer() { return _computer; } //设置CPU生产商 void SetFactory(CPUFactory* factory) { _factory = factory; } private: DELLComputer* _computer; CPUFactory* _factory; }; //定义客户类,从品牌机厂商订购电脑。 class Client { public: void GetComputer(ComputerBuilder* builder) { builder->BulidComputer(); _computer = builder->GetComputer(); } private: Computer* _computer; }; //最后开始使用了 int main() { //世界上有了DELL DELL* dell = new DELL(); //世界上有了Intel Intel* intel = new Intel(); //我是一个客户 Client me; //我想要一台有i7 930 CPU的DELL,于是打电话给DELL,叫DELL给我造一个。。。 //DELL为了我先去找到Intel dell->SetFactory(intel); //然后DELL给我电脑了 me.GetComputer(dell); } /* 最后 这个两个模式一起用 想要什么牌子的电脑 想换什么牌子的CPU变得好快 太爽了 */