能自己做的ppt网站,展览会建设网站平台的作用,wordpress新浪采集,网站二次开发合同以下是针对C03标准的抽象工厂模式#xff08;Abstract Factory#xff09;的详细讲解#xff0c;包含模式原理、C03适配实现、代码示例及使用说明#xff0c;适合需要兼容旧标准的开发场景。
一、抽象工厂模式基础#xff08;C03语境#xff09;
抽象工厂模式是创建型模式…以下是针对C03标准的抽象工厂模式Abstract Factory的详细讲解包含模式原理、C03适配实现、代码示例及使用说明适合需要兼容旧标准的开发场景。
一、抽象工厂模式基础C03语境
抽象工厂模式是创建型模式的重要成员专注于一系列相互关联的产品族创建。在C03环境中虽然缺少智能指针和现代语法但通过原始指针、虚函数和类继承依然能完整实现其核心功能
核心目标提供一个接口用于创建多个产品族中的产品且客户端无需知道具体产品的类型。典型场景跨平台开发如Windows/Linux组件、数据库驱动套件如MySQL/Oracle连接命令对象等需要配套产品的场景。
二、C03中的核心角色实现
抽象工厂模式包含4个核心角色在C03中通过类层次结构实现角色定义与实现要点C03抽象产品Abstract Product纯虚类定义某类产品的接口如按钮、文本框包含纯虚方法和虚析构函数避免析构泄漏。具体产品Concrete Product继承抽象产品实现具体功能如Windows按钮重写虚函数时无需override关键字。抽象工厂Abstract Factory纯虚类声明创建各抽象产品的工厂方法如createButton()返回抽象产品指针。具体工厂Concrete Factory继承抽象工厂实现工厂方法通过new创建并返回具体产品指针需客户端手动管理内存。三、完整代码实现C03
以“数据库访问组件”为例实现支持MySQL和Oracle的“连接”与“命令”产品族
#include iostream
#include string// 1. 抽象产品A数据库连接
class DBConnection {
public:virtual void connect() const 0; // 连接数据库virtual void disconnect() const 0; // 断开连接virtual ~DBConnection() {} // 虚析构函数
};// 1. 抽象产品B数据库命令
class DBCommand {
public:virtual void execute(const std::string sql) const 0; // 执行SQLvirtual ~DBCommand() {}
};// 2. 具体产品A1MySQL连接
class MySQLConnection : public DBConnection {
public:void connect() const {std::cout MySQL: 连接到数据库服务器 std::endl;}void disconnect() const {std::cout MySQL: 断开数据库连接 std::endl;}
};// 2. 具体产品B1MySQL命令
class MySQLCommand : public DBCommand {
public:void execute(const std::string sql) const {std::cout MySQL: 执行SQL - sql std::endl;}
};// 2. 具体产品A2Oracle连接
class OracleConnection : public DBConnection {
public:void connect() const {std::cout Oracle: 连接到数据库服务器 std::endl;}void disconnect() const {std::cout Oracle: 断开数据库连接 std::endl;}
};// 2. 具体产品B2Oracle命令
class OracleCommand : public DBCommand {
public:void execute(const std::string sql) const {std::cout Oracle: 执行SQL - sql std::endl;}
};// 3. 抽象工厂数据库组件工厂
class DBFactory {
public:virtual DBConnection* createConnection() const 0; // 创建连接virtual DBCommand* createCommand() const 0; // 创建命令virtual ~DBFactory() {}
};// 4. 具体工厂1MySQL工厂
class MySQLFactory : public DBFactory {
public:DBConnection* createConnection() const {return new MySQLConnection(); // C03用new创建返回原始指针}DBCommand* createCommand() const {return new MySQLCommand();}
};// 4. 具体工厂2Oracle工厂
class OracleFactory : public DBFactory {
public:DBConnection* createConnection() const {return new OracleConnection();}DBCommand* createCommand() const {return new OracleCommand();}
};// 客户端使用数据库组件
class DataAccess {
private:DBFactory* factory;DBConnection* conn;DBCommand* cmd;public:// 构造函数接收具体工厂DataAccess(DBFactory* f) : factory(f), conn(0), cmd(0) {conn factory-createConnection();cmd factory-createCommand();}// 析构函数手动释放内存C03关键步骤~DataAccess() {delete cmd;delete conn;// 工厂由外部管理此处不删除}// 业务方法执行数据库操作void doOperation() const {conn-connect();cmd-execute(SELECT * FROM users);conn-disconnect();}
};// 演示代码
int main() {// 场景1使用MySQLstd::cout MySQL操作 std::endl;MySQLFactory mysqlFactory;DataAccess mysqlAccess(mysqlFactory);mysqlAccess.doOperation();// 场景2使用Oraclestd::cout \n Oracle操作 std::endl;OracleFactory oracleFactory;DataAccess oracleAccess(oracleFactory);oracleAccess.doOperation();return 0;
}
四、C03实现细节说明内存管理策略
C03没有智能指针必须显式使用new创建对象并用delete释放如DataAccess析构函数中释放conn和cmd。工厂对象建议使用栈分配如MySQLFactory mysqlFactory避免动态内存管理复杂度过高。严格遵循“谁创建谁释放”原则DataAccess创建产品因此负责释放工厂由外部传入不负责释放。多态保障
所有抽象类如DBConnection必须定义虚析构函数否则删除子类对象时可能只调用基类析构函数导致内存泄漏。子类重写虚函数时函数签名参数、返回值、const属性必须与基类完全一致C03无override检查需手动保证。产品族兼容性
同一具体工厂创建的产品如MySQLFactory的MySQLConnection和MySQLCommand天然兼容确保数据库操作正常协同。切换数据库类型时只需替换具体工厂如OracleFactory客户端代码DataAccess无需修改符合开闭原则。五、C03环境下的优缺点
优点
隔离具体实现客户端代码如DataAccess仅依赖抽象接口与MySQLConnection等具体类解耦。产品族一致性确保同一工厂的产品可正确协作如MySQL连接只能搭配MySQL命令。便于扩展产品族新增数据库如PostgreSQL时只需添加PostgreSQLFactory及对应产品无需修改现有代码。
缺点C03特有
内存管理复杂需手动delete对象易出现泄漏或二次释放问题可通过工厂模式单例模式优化。类数量膨胀每增加一个产品族或产品类型需新增多个类如3个数据库×2个产品6个具体产品类3个工厂类。扩展新产品类型困难若需新增产品如DBReader需修改抽象工厂接口及所有具体工厂违反开闭原则。
六、使用建议C03项目
适合场景产品族稳定新增产品族频繁但新增产品类型少的项目如跨平台组件库、数据库驱动套件。内存优化可将具体工厂设计为单例避免重复创建产品对象可考虑对象池模式减少new/delete开销。与工厂方法结合若需新增产品类型如DBReader可在具体工厂中用工厂方法模式实现该产品的创建降低修改成本。
总结
在C03中实现抽象工厂模式虽然需要手动管理内存和注意多态细节但其核心价值——封装产品族创建、保证组件兼容性、简化客户端使用——依然显著。对于需要兼容旧标准且涉及多组关联产品创建的场景这是一种可靠的设计选择。