抽象工厂模式

动机:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aBggZqHs-1591346523107)(E:\md文件资源%5CUsers%5CWGJ%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1591255726496.png)]

数据库demo:

版本1:

EmployeeDAO.cpp

class EmployeeDAO{
public:
    vector<EmployeeDO> GetEmployees(){
        SqlConnection* connection = new SqlConnection();
        connection->ConnectionString("...");
        
        SqlCommand* command = new SqlCommand();
        command->CommandText("...");
        
        SqlDataReader* reader = command->ExecuteReader();
        
        while(reader->Read()){
            
        }
    }
};

版本2:

EmployeeDAO2.cpp

//数据库访问有关的基类
class IDBConnection{
    
};
//工厂基类
class IDBConnectionFactory{
public:
    virtual IDBConnection* CreateDBConnection() = 0;
};

class IDBCommand{
    
};
class IDataReader{
    
};

//支持Sql server
class SqlConnection : public IDBConnection{
    
};
//具体工厂
class SqlConnectionFactory : public IDBConntionFactory{
    
};

class SqlCommand : public IDBCommand{
    
};
class SqlDataReader : public IDataReader{
    
};

//支持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()){
            
        }
    }
};

问题:使用者可能传入dbConnectionFactory是sqlserver的,但是dbCommandFactory是mysql的。

EmployeeDAO3.cpp

//数据库访问有关的基类
class IDBConnection{
    
};
class IDBCommand{
    
};
class IDataReader{
    
};

class IDBFactory{
public:
    virtual IDBConnection* CreateDBConnection() = 0; //思想:将这3个关联的放到一起
    virtual IDBCommand* CreateDBCommand() = 0;
    virtual IDataReder* CreateDataReader() = 0;
};



//支持Sql server
class SqlConnection : public IDBConnection{
    
};
class SqlCommand : public IDBCommand{
    
};
class SqlDataReader : public IDataReader{
    
};
//具体工厂
class SqlDBFactory : public IDBFactory{
    virtual IDBConnection* CreateDBConnection(){
        
    }
    virtual IDBCommand* CreateDBCommand(){}
    virtual IDataReder* CreateDataReader(){}
};



//支持Oracle
class OracleConnection : public IDBConnection{
    
};
class OracleCommand : public IDBCommand{
    
};
class OracleDataReader : public IDataReader{
    
};
//具体工厂
class OracleDBFactory : public IDBFactory{
    virtual IDBConnection* CreateDBConnection(){
        
    }
    virtual IDBCommand* CreateDBCommand(){}
    virtual IDataReder* CreateDataReader(){}
};


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()){
            
        }
    }
};

模式定义:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KkF8dHqc-1591346523109)(E:\md文件资源%5CUsers%5CWGJ%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1591255793611.png)]

结构:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-38Htbrqm-1591346523112)(E:\md文件资源%5CUsers%5CWGJ%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1591256615144.png)]

标识图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F3lhEiG5-1591346523116)(E:\csdn博客备份%5CUsers%5CWGJ%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1591328630904.png)]

A B C表示IDBConnection IDBCommand IDBDataReader

1 2 3 代表 sqlserver Oracle等

要点总结:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2GfRgINk-1591346523119)(E:\csdn博客备份%5CUsers%5CWGJ%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1591346477589.png)]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值