当前位置: 首页> 科技> IT业 > 网页设计与制作教程清华大学出版社_广告设计模板网站_怎样宣传自己的品牌_新闻头条最新消息

网页设计与制作教程清华大学出版社_广告设计模板网站_怎样宣传自己的品牌_新闻头条最新消息

时间:2025/7/18 7:06:42来源:https://blog.csdn.net/qq_38154295/article/details/143271991 浏览次数:0次
网页设计与制作教程清华大学出版社_广告设计模板网站_怎样宣传自己的品牌_新闻头条最新消息

1. “对象创建”模式

  • 通过 “对象创建” 模式绕开new,来避免对象创建(new)过程中导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。
  • 典型模式
    • Factory Method
    • Abstract Factory
    • Prototype
    • Builder

2. Abstract Factory 抽象工厂

2.1 动机(Motivation)

  • 在软件系统中,经常面临着 “一系列相互依赖的对象” 的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。
  • 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种 “封装机制” 来避免客户程序和这种 “多系列具体对象创建工作” 的紧耦合?

2.2 模式定义

提供一个接口,让该接口负责创建一系列 “相关或者相互依赖的对象”,无需指定它们具体的类。
——《设计模式》GoF

2.3 实例代码

2.3.1 EmployeeDAO1
class EmployeeDAO {  
public:vector<EmployeeDO> GetEmployees() {// 创建数据库连接SqlConnection* connection = new SqlConnection();connection->ConnectionString = "...";// 创建sql命令SqlCommand* command = new SqlCommand();command->CommandText = "...";// 将sql命令与数据库连接关联command->SetConnection(connection);// 执行sql命令,获取数据SqlDataReader* reader = command->ExecuteReader();while (reader->Read()) {}}
};
2.3.2 EmployeeDAO2
/******************** 数据库访问有关的基类 ********************/ 
// 数据库连接类
class IDBConnection {};// 数据库连接对象创建工厂
class IDBConnectionFactory {
public:virtual IDBConnection* CreateDBConnection() = 0;
};// 数据库命令类
class IDBCommand {};// 数据库命令对象创建工厂
class IDBCommandFactory {
public:virtual IDBCommand* CreateDBCommand() = 0;
};class IDataReader {};// 数据库数据读取对象创建工厂
class IDataReaderFactory {
public:virtual IDataReader* CreateDataReader() = 0;
};// 支持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()) {}}
};
2.3.3 EmployeeDAO3
// 数据库访问有关的基类
class IDBConnection {};class IDBCommand {};class IDataReader {};/*将有关联性的对象创建工作放在一个类中进行,sql连接、sql命令、sql数据读取三种对象是相互依赖的关系sql连接只能跟sql的命令、sql数据的读取对象关联使用,所以一次性创建sql的连接、命令和数据读取对象
*/ 
class IDBFactory {
public:virtual IDBConnection* CreateDBConnection() = 0;virtual IDBCommand* CreateDBCommand() = 0;virtual IDataReader* CreateDataReader() = 0;
};// 支持SQL Server
class SqlConnection : public IDBConnection {};class SqlCommand : public IDBCommand {};class SqlDataReader : public IDataReader {};class SqlDBFactory : public IDBFactory {
public:virtual IDBConnection* CreateDBConnection() = 0;virtual IDBCommand* CreateDBCommand() = 0;virtual IDataReader* CreateDataReader() = 0; 
};// 支持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()) {}}
};

2.4 结构(Structure)

在这里插入图片描述

2.5 要点总结

  • 如果没有应对 “多系列对象构建” 的需求变化,则没有必要使用 Abstract Factory 模式,这时候使用简单的工厂完全可以;
  • “系列对象” 指的是在某一特定系列下的对象之间有相互依赖、或作用的关系,不同系列的对象之间不能相互依赖;
  • Abstract Factory 模式主要在于应对 “新系列” 的需求变动,其缺点在于难以应对 “新对象” 的需求变动。
关键字:网页设计与制作教程清华大学出版社_广告设计模板网站_怎样宣传自己的品牌_新闻头条最新消息

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: