计划模式之抽象工厂

怀念夏天  金牌会员 | 2024-8-24 18:11:20 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 548|帖子 548|积分 1644

一、抽象工厂概念

抽象工厂模式是一种创建型计划模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
抽象工厂模式的焦点头脑是将对象的创建与利用分离开来,从而实现系统的松耦合。在抽象工厂模式中,客户端不必要知道具体产物的类名,只必要知道产物的抽象类或接口即可。
   抽象工厂模式包含以下脚色:
  1. 抽象工厂:定义了一组创建产物的方法,每个方法对应一个具体的产物族。
  2. 具体工厂:实现抽象工厂接口,负责创建一组具体的产物。
  3. 抽象产物:定义了产物的公共接口。
  4. 具体产物:实现抽象产物接口,是具体工厂创建的产物。
    抽象工厂模式的实用场景:
          1. 系统必要一组相关的产物,而这些产物之间存在肯定的关联或依赖关系。
          2. 系统必要在差别的平台或差别的环境下利用差别的产物。
          3. 系统必要提供一个产物类库,而且这些产物的实现都必须相互兼容。
    抽象工厂模式是一种创建型计划模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。抽象工厂模式是工厂方法模式的升级版,它不仅可以创建单个对象,还可以创建一系列相关的对象。
  

类图及代码如下:

  1. /*  
  2.     如果想要生产一条新的生产线,需要修改抽象工厂ModernFurnitureFactor及它的子类和具体工厂,
  3.     还需要修改抽象产品Chair和Table,以及具体产品ModernChair和ModernTable,这违背了开闭原则
  4. */
  5. //
  6. #include <iostream>
  7. using namespace std;
  8. class Chair
  9. {
  10. public:
  11.     virtual~Chair() {}
  12.     virtual void sitOn() const = 0;
  13. };
  14. class ModernChair: public Chair
  15. {
  16. public:
  17.     virtual ~ModernChair() {}
  18.     virtual void sitOn() const override
  19.     {
  20.         cout << "可以被坐下的ModernChair" << endl;
  21.     }
  22. };
  23. class ChineseChair: public Chair
  24. {
  25. public:
  26.     virtual~ChineseChair() {}
  27.     virtual void sitOn() const override
  28.     {
  29.         cout << "可以被坐下的ChineseChair" << endl;
  30.     }
  31. };
  32. class Table
  33. {
  34. public:
  35.     virtual~Table() {}
  36.     virtual void putOn() const = 0;
  37. };
  38. class ModernTable : public Table
  39. {
  40. public:
  41.     virtual ~ModernTable() {}
  42.     virtual void putOn() const override
  43.     {
  44.         cout << "ModernTable" << endl;
  45.     }
  46. };
  47. class ChineseTable : public Table
  48. {
  49. public:
  50.     virtual~ChineseTable() {}
  51.     virtual void putOn() const override
  52.     {
  53.         cout << "ChineseTable" << endl;
  54.     }
  55. };
  56. class FurnitureFactory//抽象工厂
  57. {
  58. public:
  59.     virtual Chair* createChair() const = 0;
  60.     virtual Table* createTable() const = 0;
  61.     virtual ~FurnitureFactory() {}
  62. };
  63. class ModernStyleFactory : public FurnitureFactory
  64. {
  65. public:
  66.     virtual Chair* createChair() const override
  67.     {
  68.         return new ModernChair();
  69.     }
  70.     virtual Table* createTable() const override
  71.     {
  72.         return new ModernTable();
  73.     }
  74. };
  75. class ChineseStyleFactory : public FurnitureFactory
  76. {
  77. public:
  78.     virtual Chair* createChair() const override
  79.     {
  80.         return new ChineseChair();
  81.     }
  82.     virtual Table* createTable() const override
  83.     {
  84.         return new ChineseTable();
  85.     }
  86. };
  87. class Client
  88. {
  89. private:
  90.     FurnitureFactory* m_factory;
  91. public:
  92.     Client(FurnitureFactory* factory)
  93.     {
  94.         setFactory(factory);
  95.     }
  96.     void buyFurniture()
  97.     {
  98.         Chair* chair = m_factory->createChair();
  99.         Table* table = m_factory->createTable();
  100.         chair->sitOn();
  101.         table->putOn();
  102.         delete chair;
  103.         delete table;
  104.     }
  105.     void setFactory(FurnitureFactory* factory)
  106.     {
  107.         m_factory = factory;
  108.     }
  109. };
  110. int main()
  111. {
  112.     ModernStyleFactory modernFactory;
  113.     Client client(&modernFactory);
  114.     client.buyFurniture();
  115.     ChineseStyleFactory chineseFactory;
  116.     client.setFactory(&chineseFactory);
  117.     client.buyFurniture();
  118.     return 0;
  119. }
复制代码
二、抽象工厂的优缺点

   抽象工厂模式的长处:
          1. 可以在不修改客户端代码的情况下,更换产物系列。
          2. 可以保证客户端利用的产物是同一系列的,避免了产物之间的不兼容问题。
          3. 可以将产物的创建与利用分离开来,从而实现系统的松耦合。
  抽象工厂模式的缺点:
          1. 增加新的产物族比较困难,必要修改抽象工厂和所有的具体工厂。
          2. 增加新的产物等级结构比较困难,必要修改抽象工厂和所有的具体工厂。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

怀念夏天

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表