计划模式12:抽象工厂模式

打印 上一主题 下一主题

主题 1050|帖子 1050|积分 3150

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

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

x
  系列总链接:《谎话计划模式》学习记录_net 谎话计划-CSDN博客
参考:
C++计划模式:抽象工厂模式(风格切换案例)_c++ 抽象工厂-CSDN博客
1.概念

       抽象工厂模式(Abstract Factory Pattern)是软件计划模式中的一种创建型模式,它提供了一种创建一系列相干或相互依赖对象的接口,而无需指定它们详细的类。这种模式夸大的是眷属的概念,即一个工厂可以生产出一整套兼容的产品。
2.结构与实现

结构:



  • 抽象工厂 (Abstract Factory)
定义了一个创建一组相干或相互依赖对象的接口,但不负责这些对象的详细类。它声明了一组用于创建不同产品的方法,但并不实现它们。


  • 详细工厂 (Concrete Factory)
实现了抽象工厂接口,负责创建详细的产品对象。每个详细工厂对应一个特定的产品族,并可以大概创建该族中的全部产品。


  • 抽象产品 (Abstract Product)
为每类产品定义了一个接口,详细产品的类实现这个接口。不同的产品族大概有不同的抽象产品接口。


  • 详细产品 (Concrete Product)
由详细工厂创建的对象,实现了抽象产品接口。每个详细产品属于一个特定的产品族,并且与同一族中的其他产品兼容。


  • 客户端代码 (Client Code)
客户端代码利用抽象工厂和抽象产品接口来操纵对象,而不直接引用详细工厂或详细产品的类。这使得客户端代码可以独立于详细的产品实现。
通过上述结构,抽象工厂模式提供了一种方式来创建一系列相干的对象,而无需指定它们的详细类。这种方式不仅提高了代码的灵活性和可维护性,还使得添加新的产品族变得更为简单,因为只需要增长一个新的详细工厂和相应的产品实现即可。
实现:

  1. #ifndef ABSTRACTFACTORY_H
  2. #define ABSTRACTFACTORY_H
  3. //抽象产品类
  4. class IProductPhone
  5. {
  6. public:
  7.     IProductPhone() {}
  8.     virtual void showPhoneType(){}
  9. };
  10. //具体产品类
  11. class Piphone : public IProductPhone
  12. {
  13. public:
  14.     Piphone() {}
  15.     void showPhoneType(){qDebug() << "i am iphone";}
  16. };
  17. class PXiaomi : public IProductPhone
  18. {
  19. public:
  20.     PXiaomi() {}
  21.     void showPhoneType(){qDebug() << "i am xiaomi";}
  22. };
  23. //抽象工厂类
  24. class IFactory
  25. {
  26. public:
  27.     IFactory() {}
  28.     virtual IProductPhone* createPhone(){}
  29. };
  30. //具体工厂类
  31. class IphoneFactory : public IFactory
  32. {
  33. public:
  34.     IphoneFactory(){}
  35.     IProductPhone* createPhone(){qDebug() << "create a iphone"; return new Piphone;}
  36. };
  37. class XiaomiFactory : public IFactory
  38. {
  39. public:
  40.     XiaomiFactory(){}
  41.     IProductPhone* createPhone(){qDebug() << "create a xiaomi"; return new PXiaomi;}
  42. };
  43. #endif // ABSTRACTFACTORY_H
复制代码
利用:
  1. #include <QCoreApplication>
  2. #include <QDebug>
  3. #include "abstractFactory.h"
  4. int main(int argc, char *argv[])
  5. {
  6.     IFactory* ifact=nullptr;
  7.     IProductPhone* iprod = nullptr;
  8.     QString currentFact = "xiaomi";
  9.     if("xiaomi" == currentFact){
  10.         ifact = new XiaomiFactory;
  11.     }else if("iphone" == currentFact){
  12.         ifact = new IphoneFactory;
  13.     }
  14.     iprod = ifact->createPhone();
  15.     iprod->showPhoneType();
  16.     return 0;
  17. }
复制代码
3.应用



  • 数据库访问层(DAL)
当应用步伐需要支持多种数据库后端时,可以为每种数据库类型定义一个工厂,用于创建相应的数据访问对象(DAO)。这样可以轻松切换数据库而无需修改业务逻辑代码。如:


  • MySQLFactory 创建适用于 MySQL 数据库的数据访问对象。
  • OracleFactory 创建适用于 Oracle 数据库的数据访问对象。
4.优缺点及适用环境

优点:



  • 将客户端代码与详细的产品实现解耦:
客户端只需要依赖于抽象接口,而不需要知道详细的类。这提高了代码的灵活性和可维护性。


  • 易于添加新的产品族:
只需创建一个新的详细工厂和相干的产品实现,即可扩展系统支持新的产品族,符合“开闭原则”。


  • 确保同一产品族的产品一起利用:
确保从同一个工厂创建的产品是兼容的,避免了不同产品族之间的不一致问题。


  • 简化了复杂的对象创建逻辑:
将对象创建逻辑集中到工厂中,使得客户端代码更加简洁,减少了重复代码。

缺点:



  • 增长了系统的复杂度:
引入了额外的接口和类,大概会使系统更难明白,特别是对于小型项目或简单需求来说。


  • 难以添加新产品:
如果需要添加一个新的产品类型(而不是新的产品族),则必须修改全部工厂类,违反了“开闭原则”。


  • 大概导致太过计划:
在一些场景下,大概没有必要引入这么复杂的模式,导致计划过于复杂,增长不必要的开发和维护成本。

适用环境:



  • 当系统需要独立于其产品的创建、组合和表示时:
特别是当你希望提供一个框架或库,但不想暴露内部的详细实现细节。


  • 当一个系统要由多个产品系列中的一个来配置时:
好比多平台UI库、多数据库后端的支持等,每个系列有本身的一组相干联的对象。


  • 当系统需要支持插件或模块化扩展时:
插件可以提供本身的工厂实现,以创建特定功能和服务,而不影响核心系统。


  • 当需要频繁切换不同产品族时:
比方,在运行时根据用户选择或其他条件动态地改变产品族。

      总结来说,抽象工厂模式非常适合那些需要处理惩罚多个产品系列的应用步伐,并且这些系列中的对象需要保持一致性。它有助于提高代码的灵活性和可维护性,但也大概带来额外的复杂性和计划上的挑衅。在决定是否采用此模式时,应衡量项目的现实需求和复杂度。

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

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

北冰洋以北

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表