5.2 抽象工厂模式

动机:在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。

代码示例:

实现利用数据库的业务逻辑,支持多数据库(Sql,Oracle等),有连接、命令、读取等功能。

其中命令,连接功能之间有相互联系。

方法一(使用工厂方法):

每个功能类有一个创建的工厂,如IDBConnection与IDBConnectionFactory

  1. //数据库访问有关的基类
  2. class IDBConnection{
  3.  
  4. };
  5. class IDBConnectionFactory{
  6. public:
  7. virtual IDBConnection* CreateDBConnection()=;
  8. };
  9.  
  10. class IDBCommand{
  11.  
  12. };
  13. class IDBCommandFactory{
  14. public:
  15. virtual IDBCommand* CreateDBCommand()=;
  16. };
  17.  
  18. class IDataReader{
  19.  
  20. };
  21. class IDataReaderFactory{
  22. public:
  23. virtual IDataReader* CreateDataReader()=;
  24. };
  25.  
  26. //支持SQL Server
  27. class SqlConnection: public IDBConnection{
  28.  
  29. };
  30. class SqlConnectionFactory:public IDBConnectionFactory{
  31.  
  32. };
  33.  
  34. class SqlCommand: public IDBCommand{
  35.  
  36. };
  37. class SqlCommandFactory:public IDBCommandFactory{
  38.  
  39. };
  40.  
  41. class SqlDataReader: public IDataReader{
  42.  
  43. };
  44. class SqlDataReaderFactory:public IDataReaderFactory{
  45.  
  46. };
  47.  
  48. //支持Oracle
  49. class OracleConnection: public IDBConnection{
  50.  
  51. };
  52.  
  53. class OracleCommand: public IDBCommand{
  54.  
  55. };
  56.  
  57. class OracleDataReader: public IDataReader{
  58.  
  59. };
  60.  
  61. class EmployeeDAO{
  62. IDBConnectionFactory* dbConnectionFactory;
  63. IDBCommandFactory* dbCommandFactory;
  64. IDataReaderFactory* dataReaderFactory;
  65.  
  66. public:
  67. vector<EmployeeDO> GetEmployees(){
  68. IDBConnection* connection =
  69. dbConnectionFactory->CreateDBConnection(...);
  70. connection->ConnectionString("...");
  71.  
  72. IDBCommand* command =
  73. dbCommandFactory->CreateDBCommand(...);
  74. command->CommandText("...");
  75. command->SetConnection(connection); //关联性
  76.  
  77. IDBDataReader* reader = command->ExecuteReader(); //关联性
  78. while (reader->Read()){
  79.  
  80. }
  81.  
  82. }
  83. };

分析上述代码,虽然解决了组件创建的问题。但是仔细考虑,由于功能之间具有关联性,不同类型数据库的对象并不能同时创建搭配(如sql的command和oracle的connection搭配,显然不合理)。所以考虑抽象工厂模式。见方法二:

使用一个工厂,将一系列相互依赖的的对象创建在一个工厂中实现。

  1. //数据库访问有关的基类
  2. class IDBConnection{
  3.  
  4. };
  5.  
  6. class IDBCommand{
  7.  
  8. };
  9.  
  10. class IDataReader{
  11.  
  12. };
  13.  
  14. class IDBFactory{
  15. public:
  16. virtual IDBConnection* CreateDBConnection()=;
  17. virtual IDBCommand* CreateDBCommand()=;
  18. virtual IDataReader* CreateDataReader()=;
  19.  
  20. };
  21.  
  22. //支持SQL Server
  23. class SqlConnection: public IDBConnection{
  24.  
  25. };
  26. class SqlCommand: public IDBCommand{
  27.  
  28. };
  29. class SqlDataReader: public IDataReader{
  30.  
  31. };
  32.  
  33. class SqlDBFactory:public IDBFactory{
  34. public:
  35. virtual IDBConnection* CreateDBConnection()=;
  36. virtual IDBCommand* CreateDBCommand()=;
  37. virtual IDataReader* CreateDataReader()=;
  38.  
  39. };
  40.  
  41. //支持Oracle
  42. class OracleConnection: public IDBConnection{
  43.  
  44. };
  45.  
  46. class OracleCommand: public IDBCommand{
  47.  
  48. };
  49.  
  50. class OracleDataReader: public IDataReader{
  51.  
  52. };
  53.  
  54. class EmployeeDAO{
  55. IDBFactory* dbFactory;
  56.  
  57. public:
  58. vector<EmployeeDO> GetEmployees(){
  59. IDBConnection* connection =
  60. dbFactory->CreateDBConnection();
  61. connection->ConnectionString("...");
  62.  
  63. IDBCommand* command =
  64. dbFactory->CreateDBCommand();
  65. command->CommandText("...");
  66. command->SetConnection(connection); //关联性
  67.  
  68. IDBDataReader* reader = command->ExecuteReader(); //关联性
  69. while (reader->Read()){
  70.  
  71. }
  72.  
  73. }
  74. };

模式定义:

提供一个接口,让该接口复杂创建一系列”相关或者相互依赖的对象“,无需指定它们具体的类。

类图:

要点总结:

如果没有应对”多系列对象构建“的需求变化,则没有必要使用Abstract Factory模式,这是要使用工厂方法即可。

”系列对象“指的是某一特定系列下的对象之间有相互依赖或作用的关系。不同系列的对象之间不能相互依赖。

Abstract Factory模式主要在于应对”新系列“的需求变动。其缺点在于难以应对”新对象“的需求变动。

c++ 设计模式9 (Abstract Factory 抽象工厂模式)的更多相关文章

  1. Java设计模式:Abstract Factory(抽象工厂)模式

    概念定义 抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品) ...

  2. 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式

    1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要 ...

  3. 一天一个设计模式——Abstract Factory抽象工厂模式

    一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...

  4. 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)

         今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...

  5. Abstract Factory抽象工厂模式

    抽象工厂模式是是用一个超级工厂去创建其他工厂,简单点说就是工厂的父类,属于创建型模式. 目标:提供一个创建一组对象的方法,而无需指定它们具体的类(同工厂方法). 使用场景:系统的产品有多于一个的产品族 ...

  6. Abstract Factory 抽象工厂模式

    提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂顾名思义就是对工厂的抽象,它提供了一组创建抽象产品对象的操作接口,我们实际使用的是抽象工厂的派生类,派生类中提供了操作的具 ...

  7. 2.设计模式-Abstract Factory 抽象工厂模式

    大神勿喷,不对的地方请指出来,学笔记而已. 解决的问题:应对多系列对象构建的变化或多系列(例如:崎岖的山路和平坦的马路属于一个系列) 不断的变化的创建. 使用场景:对象不变(比如有3个对象 " ...

  8. 设计模式02: Abstract Factory 抽象工厂(创建型模式)

    Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法:    //创建一个Road对象    Road road=new Road();    new的问题:    -实现依赖 ...

  9. PHP设计模式(三)抽象工厂模式(Abstract Factory)

    一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...

随机推荐

  1. C常用字符字符串处理函数

    1.strtok();字符串分片函数

  2. 开着奥迪做Uber司机是什么心态?

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. Multimedia&Network

    [Multimedia&Network] 1.Unity3D共支持4种格式音乐文件: 2.AudioSource用于指明音频源,被绑定在一个GameObject身上.光有AudioSource ...

  4. 调整V7连保监平台时问题

    11北京 XXX: 界面无法录入导致无法出单. 31上海 XXX: 送平台代码有问题 保费计算失败! 车险平台返回信息 0101010024_公司险种代码/平台险种代码('030006 '/'C02 ...

  5. CTE初识

    微软从SQl2005起引入了CTE(Common Table Expression)以强化T-SQL.这是一个类似于非持久视图的好东西. 正常的SQL语句: select * from person. ...

  6. 1) data-options

    <select class="easyui-combobox" data-options="editable:false"> <select ...

  7. 手把手教你玩转SOCKET模型之重叠I/O篇(下)

    四.     实现重叠模型的步骤 作 了这么多的准备工作,费了这么多的笔墨,我们终于可以开始着手编码了.其实慢慢的你就会明白,要想透析重叠结构的内部原理也许是要费点功夫,但是只是学会 如何来使用它,却 ...

  8. Weka EM 协方差

    Weka EM covariance description 1: Dear All, I am trying to find out what is the real meaning of the ...

  9. android ListView中button点击事件盖掉onItemClick解决办法

    ListView 1.在android应用当中,很多时候都要用到listView,但如果ListView当中添加Button后,ListView 自己的 public void onItemClick ...

  10. 当类库项目中无法使用Application.StartupPath

    通常我们WinForm编程时,要获取程序当前运行的文件夹路径会用Application.StartupPath ,但是Application.StartupPath在编写类库项目时却无法使用,因为我们 ...