c++ 设计模式9 (Abstract Factory 抽象工厂模式)
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 抽象工厂模式)的更多相关文章
- Java设计模式:Abstract Factory(抽象工厂)模式
概念定义 抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品) ...
- 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式
1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要 ...
- 一天一个设计模式——Abstract Factory抽象工厂模式
一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...
- 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)
今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...
- Abstract Factory抽象工厂模式
抽象工厂模式是是用一个超级工厂去创建其他工厂,简单点说就是工厂的父类,属于创建型模式. 目标:提供一个创建一组对象的方法,而无需指定它们具体的类(同工厂方法). 使用场景:系统的产品有多于一个的产品族 ...
- Abstract Factory 抽象工厂模式
提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂顾名思义就是对工厂的抽象,它提供了一组创建抽象产品对象的操作接口,我们实际使用的是抽象工厂的派生类,派生类中提供了操作的具 ...
- 2.设计模式-Abstract Factory 抽象工厂模式
大神勿喷,不对的地方请指出来,学笔记而已. 解决的问题:应对多系列对象构建的变化或多系列(例如:崎岖的山路和平坦的马路属于一个系列) 不断的变化的创建. 使用场景:对象不变(比如有3个对象 " ...
- 设计模式02: Abstract Factory 抽象工厂(创建型模式)
Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法: //创建一个Road对象 Road road=new Road(); new的问题: -实现依赖 ...
- PHP设计模式(三)抽象工厂模式(Abstract Factory)
一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...
随机推荐
- C常用字符字符串处理函数
1.strtok();字符串分片函数
- 开着奥迪做Uber司机是什么心态?
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Multimedia&Network
[Multimedia&Network] 1.Unity3D共支持4种格式音乐文件: 2.AudioSource用于指明音频源,被绑定在一个GameObject身上.光有AudioSource ...
- 调整V7连保监平台时问题
11北京 XXX: 界面无法录入导致无法出单. 31上海 XXX: 送平台代码有问题 保费计算失败! 车险平台返回信息 0101010024_公司险种代码/平台险种代码('030006 '/'C02 ...
- CTE初识
微软从SQl2005起引入了CTE(Common Table Expression)以强化T-SQL.这是一个类似于非持久视图的好东西. 正常的SQL语句: select * from person. ...
- 1) data-options
<select class="easyui-combobox" data-options="editable:false"> <select ...
- 手把手教你玩转SOCKET模型之重叠I/O篇(下)
四. 实现重叠模型的步骤 作 了这么多的准备工作,费了这么多的笔墨,我们终于可以开始着手编码了.其实慢慢的你就会明白,要想透析重叠结构的内部原理也许是要费点功夫,但是只是学会 如何来使用它,却 ...
- Weka EM 协方差
Weka EM covariance description 1: Dear All, I am trying to find out what is the real meaning of the ...
- android ListView中button点击事件盖掉onItemClick解决办法
ListView 1.在android应用当中,很多时候都要用到listView,但如果ListView当中添加Button后,ListView 自己的 public void onItemClick ...
- 当类库项目中无法使用Application.StartupPath
通常我们WinForm编程时,要获取程序当前运行的文件夹路径会用Application.StartupPath ,但是Application.StartupPath在编写类库项目时却无法使用,因为我们 ...