class CDbConn{
public:
CDbConn(const char* lpszConn);
bool Open();
bool Close();
};
class CDbRs{
};
//抽象产品类
class CAbsDb{
protected:
CDbConn* pConn;
public:
CAbsDb(const char* lpszConn);
~CAbsDb();
//执行SQL语句,返回结果集
public:
virtual CDbRs* Execute(const char* lpszSql) = 0;
};
//MSSql数据库
class CSqlServer : public CAbsDb{
public:
CSqlServer(const char* lpszConn);
CDbRs* Execute(const char* lpszSql);
};
//Oracle数据库
class COracle : public CAbsDb{
public:
COracle(const char* lpszConn);
CDbRs* Execute(const char* lpszSql);
};
//Access数据库
class CAccess : public CAbsDb{
public:
CAccess(const char* lpszConn);
CDbRs* Execute(const char* lpszSql);
};
//工厂类
class CDbFac{
public:
static CAbsDb* GetDb(const char* lpszConn);
};
//*********************************************************************
CDbConn::CDbConn(const char* lpszConn){}
bool CDbConn::Open(){cout << "Open DB Successfully !" << endl; return true;}
bool CDbConn::Close(){cout << "Close DB Successfully !" << endl; return true;}
//抽象产品类
CAbsDb::CAbsDb(const char* lpszConn)
{
printf("%s\n", lpszConn);
pConn = new CDbConn(lpszConn);
pConn->Open();
}
CAbsDb::~CAbsDb()
{
if(pConn != NULL){
pConn->Close();
delete pConn; pConn = NULL;
}
}
//执行SQL语句,返回结果集
//MSSql数据库
CSqlServer::CSqlServer(const char* lpszConn) : CAbsDb(lpszConn) {}
CDbRs* CSqlServer::Execute(const char* lpszSql)
{
printf("SqlServer : %s\n", lpszSql);
return NULL;//示例,实际中要返回结果集,new CRecordSet();
}
//Oracle数据库
COracle::COracle(const char* lpszConn) : CAbsDb(lpszConn){}
CDbRs* COracle::Execute(const char* lpszSql)
{
printf("Oracle : %s\n", lpszSql);
return NULL;//示例,实际中要返回结果集,new CRecordSet();
}
//Access数据库
CAccess::CAccess(const char* lpszConn) : CAbsDb(lpszConn) {}
CDbRs* CAccess::Execute(const char* lpszSql)
{
printf("Access : %s\n", lpszSql);
return NULL;//示例,实际中要返回结果集,new CRecordSet();
}
//工厂类
CAbsDb* CDbFac::GetDb(const char* lpszConn)
{
CAbsDb* pDb = NULL;
if(strcmp(lpszConn, "SqlServer") == 0) pDb = new CSqlServer(lpszConn);
else if(strcmp(lpszConn, "Oracle") == 0) pDb = new COracle(lpszConn);
else if(strcmp(lpszConn, "Access") == 0) pDb = new CAccess(lpszConn);
return pDb;
}
//客户端调用例子
void main()
{
//利用工厂方法模式切换数据库
CAbsDb* pDb = CDbFac::GetDb("SqlServer");//在这里更改数据库!
if(pDb != NULL){
cout << "Once Connected, Many Times Execute" << endl;
cout << "**********************************************" << endl;
pDb->Execute("Select * From Student");
pDb->Execute("Update Student Set Sage = Sage + 1");
pDb->Execute("Delete From Student");
cout << "**********************************************" << endl;
delete pDb; pDb = NULL;
}
}
简单工厂模式的应用之简单实现ODBC/JDBC驱动管理器的雏形
最新推荐文章于 2022-01-05 12:46:54 发布