工厂模式
工厂模式保护简单工厂模式、工厂方法模式、抽象工厂模式
简单工厂模式
简单工厂模式简介
- 一个抽象产品类,根据这个抽象产品类可派生出多个具体产品类
- 一个具体工厂类,具体工厂类用于生产多个具体产品类
代码示例
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
| class GUIDrawable { public: virtual void draw() = 0; };
class Button: public GUIDrawable { public: virtual void draw() override { } };
class CheckBox: public GUIDrawable { public: virtual void draw() override { } };
enum GUIType { GUITypeButton, GUITypeCheckBox, };
class GUIFactory { public: GUIDrawable* create(GUIType type) { switch (type) { case GUITypeButton: return new Button(); case GUITypeCheckBox: return new CheckBox(); default: return nullptr; } } };
|
工厂方法模式
工厂方法模式简介
- 一个抽象产品类,根据这个抽象产品类可派生出多个具体产品类
- 一个抽象工厂类,可以派生出多个具体工厂类
- 每个具体工厂只能创建一个具体产品
代码示例
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
| class GUIDrawable { public: virtual void draw() = 0; };
class Button: public GUIDrawable { public: virtual void draw() override { } };
class CheckBox: public GUIDrawable { public: virtual void draw() override { } };
class GUIDrawableFactory { public: virtual GUIDrawable* create() = 0; };
class ButtonFactory { public: virtual GUIDrawable* create() override { return new Button(); } };
class CheckBoxFactory { virtual GUIDrawable* create() override { return new CheckBox(); } };
|
抽象工厂模式
抽象工厂模式简介
- 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类
- 一个抽象工厂类,可以派生出多个具体工厂类
- 每个具体工厂可以创建多个具体产品
代码样例
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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| class GUIDrawable { public: virtual void draw() = 0; };
class Button: public GUIDrawable { public: virtual void clicked() = 0; };
class CheckBox: GUIDrawable { public: virtual void checked() = 0; };
class WinButton: Button { public: virtual void draw() override { }
virtual void clicked() override {
} };
class WinCheckBox: CheckBox { public: virtual void draw() override { }
virtual void checked() override {
} };
class MacButton: Button { public: virtual void draw() override { }
virtual void clicked() override {
} };
class MacCheckBox: CheckBox { public: virtual void draw() override { }
virtual void checked() override {
} };
class GUIFactory { public: virtual Button* createButton() = 0; virtual CheckBox* createCheckBox() = 0; };
class WinGUIFactory : public GUIFactory { public: virtual Button* createButton() override { return new WinButton(); }
virtual CheckBox* createCheckBox() override { return new WinCheckBox(); } };
class MacGUIFactory: public GUIFactory { public: virtual Button* createButton() override { return new MacButton(); }
virtual CheckBox* createLabel() override { return new MacCheckBox(); } };
|
总结
在许多设计工作的初期都会使用简单工厂模式,随后演化为使用工厂方法模式, 随后演化为使用抽象工厂模式,甚至继续演化为使用原型模式或生成器模式。