当前位置:   article > 正文

C++的设计模式:抽象工厂模式(Abstract Factory)

C++的设计模式:抽象工厂模式(Abstract Factory)

抽象工厂模式(Abstract Factory)是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式通过将单个的简单工厂模式组合起来实现更复杂的选择逻辑,使得增加新的功能变得更加容易,从而提高了系统的抽象性和灵活性。

意图

抽象工厂模式的主要目的是提供一个接口,用于创建一系列相关或相互依赖的对象,而不需要指定它们具体的类。

应用场景

  • 当需要创建的对象是一系列相互关联或相互依赖的产品族时。
  • 当你想提供一个产品类库,而只想显示它们的接口而不是实现时。

实现

假设我们要创建一个跨平台的UI库,它可以生成不同风格(如Light和Dark主题)的UI控件(如按钮和复选框)。这里,我们可以使用抽象工厂模式来实现。

首先,我们定义UI控件的接口和具体实现。

  1. #include <iostream>
  2. #include <string>
  3. // Button 接口
  4. class Button {
  5. public:
  6. virtual void paint() = 0;
  7. virtual ~Button() {}
  8. };
  9. // 具体产品:LightButton
  10. class LightButton : public Button {
  11. public:
  12. void paint() override {
  13. std::cout << "Rendering a button in light style." << std::endl;
  14. }
  15. };
  16. // 具体产品:DarkButton
  17. class DarkButton : public Button {
  18. public:
  19. void paint() override {
  20. std::cout << "Rendering a button in dark style." << std::endl;
  21. }
  22. };
  23. // CheckBox 接口
  24. class CheckBox {
  25. public:
  26. virtual void paint() = 0;
  27. virtual ~CheckBox() {}
  28. };
  29. // 具体产品:LightCheckBox
  30. class LightCheckBox : public CheckBox {
  31. public:
  32. void paint() override {
  33. std::cout << "Rendering a checkbox in light style." << std::endl;
  34. }
  35. };
  36. // 具体产品:DarkCheckBox
  37. class DarkCheckBox : public CheckBox {
  38. public:
  39. void paint() override {
  40. std::cout << "Rendering a checkbox in dark style." << std::endl;
  41. }
  42. };

接着,我们定义抽象工厂接口和具体工厂。

  1. // GUIFactory 是抽象工厂的接口
  2. class GUIFactory {
  3. public:
  4. virtual Button* createButton() = 0;
  5. virtual CheckBox* createCheckBox() = 0;
  6. virtual ~GUIFactory() {}
  7. };
  8. // 具体工厂:LightFactory
  9. class LightFactory : public GUIFactory {
  10. public:
  11. Button* createButton() override {
  12. return new LightButton();
  13. }
  14. CheckBox* createCheckBox() override {
  15. return new LightCheckBox();
  16. }
  17. };
  18. // 具体工厂:DarkFactory
  19. class DarkFactory : public GUIFactory {
  20. public:
  21. Button* createButton() override {
  22. return new DarkButton();
  23. }
  24. CheckBox* createCheckBox() override {
  25. return new DarkCheckBox();
  26. }
  27. };

最后,客户端代码可以这样使用:

  1. int main() {
  2. GUIFactory* factory = new LightFactory();
  3. Button* button = factory->createButton();
  4. button->paint(); // Render a button in light style.
  5. CheckBox* checkBox = factory->createCheckBox();
  6. checkBox->paint(); // Render a checkbox in light style.
  7. delete factory;
  8. delete button;
  9. delete checkBox;
  10. // 切换到暗黑风格
  11. factory = new DarkFactory();
  12. button = factory->createButton();
  13. button->paint(); // Render a button in dark style.
  14. checkBox = factory->createCheckBox();
  15. checkBox->paint(); // Render a checkbox in dark style.
  16. delete factory;
  17. delete button;
  18. delete checkBox;
  19. return 0;
  20. }

总结

抽象工厂模式通过定义一个负责创建一系列相关或相互依赖对象的接口,使得创建过程被封装在工厂的内部。这样,客户端代码只需要和接口打交道,而不需要关心具体的产品类,从而使得系统更加灵活,更容易应对变化。同时,它也有助于保持产品族的一致性。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/171930
推荐阅读
相关标签
  

闽ICP备14008679号