B站设计模式第7章——Abstract Factory

Abstract Factory 定义

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

 Abstract Factory 要点总结

(1) 如果没有 应对“多系列对象构建”的需求 变化,则没有必要使用 Abstract Factory模式,这时候使用简单的工厂完全可以。

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

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

Employee1.cpp

class EmployeeDAO{    
public:
    vector<EmployeeDO> GetEmployees(){
        SqlConnection* connection = new SqlConnection();
        connection->ConnectionString = "...";

        SqlCommand* command = new SqlCommand();
        command->CommandText="...";
        command->SetConnection(connection);

        SqlDataReader* reader = command->ExecuteReader();
        while (reader->Read()){
        }
    }
};

Employee2.cpp

//数据库访问有关的基类
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()){
        }
    }
};

Employee3.cpp

//数据库访问有关的基类
class IDBConnection{};
class IDBCommand{};
class IDataReader{};
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()){}
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_47887421/article/details/120598964