5.2 抽象工厂模式

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

代码示例:

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

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

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

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

 //数据库访问有关的基类
class IDBConnection{ };
class IDBConnectionFactory{
public:
virtual IDBConnection* CreateDBConnection()=;
}; class IDBCommand{ };
class IDBCommandFactory{
public:
virtual IDBCommand* CreateDBCommand()=;
}; class IDataReader{ };
class IDataReaderFactory{
public:
virtual IDataReader* CreateDataReader()=;
}; //支持SQL Server
class SqlConnection: public IDBConnection{ };
class SqlConnectionFactory:public IDBConnectionFactory{ }; class SqlCommand: public IDBCommand{ };
class SqlCommandFactory:public IDBCommandFactory{ }; class SqlDataReader: public IDataReader{ };
class SqlDataReaderFactory:public IDataReaderFactory{ }; //支持Oracle
class OracleConnection: public IDBConnection{ }; class OracleCommand: public IDBCommand{ }; class OracleDataReader: public IDataReader{ }; class EmployeeDAO{
IDBConnectionFactory* dbConnectionFactory;
IDBCommandFactory* dbCommandFactory;
IDataReaderFactory* dataReaderFactory; public:
vector<EmployeeDO> GetEmployees(){
IDBConnection* connection =
dbConnectionFactory->CreateDBConnection(...);
connection->ConnectionString("..."); IDBCommand* command =
dbCommandFactory->CreateDBCommand(...);
command->CommandText("...");
command->SetConnection(connection); //关联性 IDBDataReader* reader = command->ExecuteReader(); //关联性
while (reader->Read()){ } }
};

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

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

 //数据库访问有关的基类
class IDBConnection{ }; class IDBCommand{ }; class IDataReader{ }; class IDBFactory{
public:
virtual IDBConnection* CreateDBConnection()=;
virtual IDBCommand* CreateDBCommand()=;
virtual IDataReader* CreateDataReader()=; }; //支持SQL Server
class SqlConnection: public IDBConnection{ };
class SqlCommand: public IDBCommand{ };
class SqlDataReader: public IDataReader{ }; class SqlDBFactory:public IDBFactory{
public:
virtual IDBConnection* CreateDBConnection()=;
virtual IDBCommand* CreateDBCommand()=;
virtual IDataReader* CreateDataReader()=; }; //支持Oracle
class OracleConnection: public IDBConnection{ }; class OracleCommand: public IDBCommand{ }; class OracleDataReader: public IDataReader{ }; class EmployeeDAO{
IDBFactory* dbFactory; public:
vector<EmployeeDO> GetEmployees(){
IDBConnection* connection =
dbFactory->CreateDBConnection();
connection->ConnectionString("..."); IDBCommand* command =
dbFactory->CreateDBCommand();
command->CommandText("...");
command->SetConnection(connection); //关联性 IDBDataReader* reader = command->ExecuteReader(); //关联性
while (reader->Read()){ } }
};

模式定义:

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

类图:

要点总结:

如果没有应对”多系列对象构建“的需求变化,则没有必要使用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. SQL Server 字符串函数

    字符串函数 在开发T-SQL时,经常会需要对字符串进行各种各样的操作,下面介绍常用的字符串函数. 1.获取字符的ASCII码 ASCII ASCII码是对字符的标准编码.要获取字符的ASCII码就可以 ...

  2. MYSQL数据库性能调优之三:explain分析慢查询

    explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句.使用方法,在select语句前加上explain就可以了. 一.explain ...

  3. zendstudio 出现failed to create the java machine转

    是因为配置java虚拟机内存太小 打开zend for eclipse 10.5时报了个错: failed to create the java virtual machine google了一下,解 ...

  4. Eclipse 和 NetBeans 快捷键即其他常用功能比较

    按: 自己用 Eclipse, 常用的也就这些功能, 在用 NetBeans 时, 有些不顺手, 因此列表如下. Eclipse和NetBeans常用快捷键对比:  功能  Eclipse     N ...

  5. Java Service Wrapper配置详解

    #encoding=UTF-8 # Configuration files must begin with a line specifying the encoding # of the the fi ...

  6. android 检测ListView滚动到的位置

    ListView滚动 1.要用到一个监听事件是:setOnScrollListener(); API解释是: Set the listener that will receive notificati ...

  7. OSGI(面向Java的动态模型系统)

    基本简介编辑 OSGI服务平台提供在多种网络设备上无需重启的动态改变构造的功能.为了最小化耦合度和促使这些耦合度可管理,OSGi技术提供一种面向服务的架构,它能使这些组件动态地发现对方.OSGi联 O ...

  8. C#生成不重复随机数的方法

    在使用Random类生成随机数时,我们可能会碰到生成随机数重复的问题. 比如我们要生成6位数字验证码,虽然也是使用Random,但是可能出现111111,999999这样的情况. 这是因为在实例化Ra ...

  9. Python学习入门基础教程(learning Python)--5.1 Python下文件处理基本过程

    Python下的文件读写操作过程和其他高级语言如C语言的操作过程基本一致,都要经历以下几个基本过程. 1. 打开文件 首先是要打开文件,打开文件的主要目的是为了建立程序和文件之间的联系.按程序访问文件 ...

  10. 启动Tomcat的时候遇到错误

    严重: IOException while loading persisted sessions: java.io.EOFException java.io.EOFException at java. ...