简单工厂模式有个缺点,当我需要添加一件产品时,必须去修改工厂函数,违反了对扩展开放对修改关闭的原则。另外如果产品类型过多的话,工厂函数里if-else/switch-case将会非常长,难以维护,因此工厂方法应运而生。
工厂方法的思想为给定一个抽象工厂类,每件产品单独由一个工厂来生产,这个工厂继承了抽象工厂基类,当我需要添加一件产品时,只需要再增加一个工厂即可,实现了对扩展开放,对修改关闭
下面是一个工厂方法的例子,由简单工厂代码改造而来,我们将工厂设计为抽象类factory,不同型号的产品单独提供一个工厂类继承factory,需要什么型号的产品就造一个对应类型的工厂
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| #include <iostream>
enum class model { su7, modelY, M7 };
class car { public: virtual void info() = 0; virtual ~car(){}; };
class MiSu7 : public car{ public: void info() override { std::cout << "a su7 car" << std::endl; } };
class TeslaModelY : public car { public: void info() override { std::cout << "a ModelY car" << std::endl; } };
class AITOM7 : public car { public: void info() override { std::cout << "a M7 car" << std::endl; } };
class factory { public: virtual car* createCar() = 0; virtual ~factory(){}; };
class SU7factory : public factory { public: car* createCar() override { return new MiSu7(); } }; class ModelYfactory : public factory { public: car* createCar() override { return new TeslaModelY(); } }; class M7factory : public factory { public: car* createCar() override { return new AITOM7(); } };
int main() { factory* f = new SU7factory();
car *mycar = f->createCar(); mycar->info();
delete mycar; delete f; return 0; }
|