工厂模式 - 工厂方法模式、抽象工厂模式

[复制链接]
发表于 2025-11-4 14:27:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
弁言

工厂模式(Factory Pattern)是操持模式中创建型模式的一种,它提供了一种创建对象的最佳方式。工厂模式的焦点头脑是将对象的创建与利用分离,使得代码更加机动、可扩展。工厂模式重要分为两种:工厂方法模式和抽象工厂模式。
本文将具体先容工厂方法模式和抽象工厂模式的概念、实现方式以及在C++中的应用。
工厂方法模式

概念

工厂方法模式(Factory Method Pattern)界说了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式让类的实例化推迟到子类。
长处


  • 解耦:将对象的创建与利用分离,低落代码的耦合度。
  • 扩展性好:新增产物类时,只需增长相应的工厂类,无需修改现有代码。
  • 符合开闭原则:对扩睁开放,对修改关闭。
缺点


  • 类的数量增长:每增长一个产物类,就须要增长一个对应的工厂类,导致类的数量增长。
  • 复杂性增长:对于简单的对象创建,利用工厂方法模式大概会增长代码的复杂性。
实现

下面是一个简单的工厂方法模式的实现示例:
  1. #include <iostream>
  2. #include <string>
  3. // 产品接口
  4. class Product {
  5. public:
  6.     virtual ~Product() {}
  7.     virtual void use() = 0;
  8. };
  9. // 具体产品A
  10. class ProductA : public Product {
  11. public:
  12.     void use() override {
  13.         std::cout << "Using Product A" << std::endl;
  14.     }
  15. };
  16. // 具体产品B
  17. class ProductB : public Product {
  18. public:
  19.     void use() override {
  20.         std::cout << "Using Product B" << std::endl;
  21.     }
  22. };
  23. // 工厂接口
  24. class Factory {
  25. public:
  26.     virtual ~Factory() {}
  27.     virtual Product* createProduct() = 0;
  28. };
  29. // 具体工厂A
  30. class FactoryA : public Factory {
  31. public:
  32.     Product* createProduct() override {
  33.         return new ProductA();
  34.     }
  35. };
  36. // 具体工厂B
  37. class FactoryB : public Factory {
  38. public:
  39.     Product* createProduct() override {
  40.         return new ProductB();
  41.     }
  42. };
  43. int main() {
  44.     Factory* factoryA = new FactoryA();
  45.     Product* productA = factoryA->createProduct();
  46.     productA->use();
  47.     Factory* factoryB = new FactoryB();
  48.     Product* productB = factoryB->createProduct();
  49.     productB->use();
  50.     delete productA;
  51.     delete productB;
  52.     delete factoryA;
  53.     delete factoryB;
  54.     return 0;
  55. }
复制代码
应用场景

工厂方法模式实用于以了局景:

  • 不确定对象的范例:当创建对象时,不确定具体要创建哪种范例的对象。
  • 须要扩展:当须要扩展体系,增长新的产物类时,利用工厂方法模式可以克制修改现有代码。
抽象工厂模式

概念

抽象工厂模式(Abstract Factory Pattern)提供一个创建一系列相干或相互依靠对象的接口,而无需指定它们具体的类。抽象工厂模式是工厂方法模式的扩展,它用于创建一组相干的对象。
长处


  • 高内聚:将相干的产物族会合在一起创建,包管产物族的同等性。
  • 解耦:将产物的创建与利用分离,低落代码的耦合度。
  • 符合开闭原则:对扩睁开放,对修改关闭。
缺点


  • 类的数量增长:每增长一个产物族,就须要增长一个对应的工厂类,导致类的数量增长。
  • 复杂性增长:对于简单的对象创建,利用抽象工厂模式大概会增长代码的复杂性。
实现

下面是一个简单的抽象工厂模式的实现示例:
  1. #include <iostream>
  2. #include <string>
  3. // 抽象产品A
  4. class AbstractProductA {
  5. public:
  6.     virtual ~AbstractProductA() {}
  7.     virtual void use() = 0;
  8. };
  9. // 具体产品A1
  10. class ProductA1 : public AbstractProductA {
  11. public:
  12.     void use() override {
  13.         std::cout << "Using Product A1" << std::endl;
  14.     }
  15. };
  16. // 具体产品A2
  17. class ProductA2 : public AbstractProductA {
  18. public:
  19.     void use() override {
  20.         std::cout << "Using Product A2" << std::endl;
  21.     }
  22. };
  23. // 抽象产品B
  24. class AbstractProductB {
  25. public:
  26.     virtual ~AbstractProductB() {}
  27.     virtual void use() = 0;
  28. };
  29. // 具体产品B1
  30. class ProductB1 : public AbstractProductB {
  31. public:
  32.     void use() override {
  33.         std::cout << "Using Product B1" << std::endl;
  34.     }
  35. };
  36. // 具体产品B2
  37. class ProductB2 : public AbstractProductB {
  38. public:
  39.     void use() override {
  40.         std::cout << "Using Product B2" << std::endl;
  41.     }
  42. };
  43. // 抽象工厂
  44. class AbstractFactory {
  45. public:
  46.     virtual ~AbstractFactory() {}
  47.     virtual AbstractProductA* createProductA() = 0;
  48.     virtual AbstractProductB* createProductB() = 0;
  49. };
  50. // 具体工厂1
  51. class ConcreteFactory1 : public AbstractFactory {
  52. public:
  53.     AbstractProductA* createProductA() override {
  54.         return new ProductA1();
  55.     }
  56.     AbstractProductB* createProductB() override {
  57.         return new ProductB1();
  58.     }
  59. };
  60. // 具体工厂2
  61. class ConcreteFactory2 : public AbstractFactory {
  62. public:
  63.     AbstractProductA* createProductA() override {
  64.         return new ProductA2();
  65.     }
  66.     AbstractProductB* createProductB() override {
  67.         return new ProductB2();
  68.     }
  69. };
  70. int main() {
  71.     AbstractFactory* factory1 = new ConcreteFactory1();
  72.     AbstractProductA* productA1 = factory1->createProductA();
  73.     AbstractProductB* productB1 = factory1->createProductB();
  74.     productA1->use();
  75.     productB1->use();
  76.     AbstractFactory* factory2 = new ConcreteFactory2();
  77.     AbstractProductA* productA2 = factory2->createProductA();
  78.     AbstractProductB* productB2 = factory2->createProductB();
  79.     productA2->use();
  80.     productB2->use();
  81.     delete productA1;
  82.     delete productB1;
  83.     delete factory1;
  84.     delete productA2;
  85.     delete productB2;
  86.     delete factory2;
  87.     return 0;
  88. }
复制代码
应用场景

抽象工厂模式实用于以了局景:

  • 产物族:当须要创建一组相干的产物时,利用抽象工厂模式可以包管产物族的同等性。
  • 跨平台:当须要为差别的平台创建一组相干的产物时,利用抽象工厂模式可以方便地切换平台。
总结

工厂模式是一种非常实用的操持模式,它将对象的创建与利用分离,使得代码更加机动、可扩展。工厂方法模式实用于创建单一产物,而抽象工厂模式实用于创建一组相干的产物。在实际开辟中,根据具体需求选择符合的工厂模式,可以进步代码的可维护性和可扩展性。
盼望本文能资助你更好地明确工厂方法模式和抽象工厂模式的概念、实现方式以及应用场景。假如你有任何标题或发起,接待在批评区留言讨论。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表