我正在开始一个新的应用程序,它将能够同时连接到不同提供商的许多数据库。
在模式中思考以轻松使用所有连接,我制作了这段代码(C ++):
class Bd
{
private:
TUniConnection* mpConnection;
public:
Bd::Bd()
{
mpConnection = new TUniConnection(NULL);
}
void Bd::setProvider(UnicodeString provider)
{
mpConnection->ProviderName = provider;
}
void Bd::connect()
{
mpConnection->Connect();
}
UnicodeString Bd::getProvider() const
{ return mpConnection->ProviderName; }
Bd::~Bd()
{ delete mpConnection; }
};
// In the right path to become a singleton-helper-utility-god-class
class App
{
public:
// Default bd. Just a shortcut.
Bd* bd;
App()
{ bd = getBd("BDMain"); }
~App()
{ delBd("BDMain"); }
Bd* getBd(UnicodeString key)
{
if(mpBdList[key] != NULL)
{
return mpBdList[key];
}
mpBdList[key] = new Bd;
return mpBdList[key];
}
void delBd(UnicodeString key)
{
delete mpBdList[key];
mpBdList[key] = NULL;
}
private:
std::map<UnicodeString, Bd *>mpBdList;
};
// Just an example of use.
int main()
{
// Consider this instance global/singleton/etc
App* app = new App;
app->bd->setProvider("Oracle");
app->connect();
// Outside the main, probably in some form (this method don't exist - yet)
app->bd->query("blah blah blah");
app->getBd("settings")->setProvider("SQLite");
app->getBd("settings")->connect();
app->getBd("settings")->query("blah blah blah");
}
显然还没有工作,但是你们可以对我的想法有所了解。 理论上,看起来很完美。 我可以轻松快捷地访问主连接(app-> bd)。与其他连接相同。 即使对我来说也是完美的,每个人都说这是反模式的全部。
如果没有这个“帮助器”类,我怎么能实现几乎相同的结果,并且仍然能够将我的连接/设置共享给所有表单和类,而不向参数/构造函数传递任何内容。
感谢。
答案 0 :(得分:1)
我会将mpBdList
设为Bd
的静态私有成员,同样制作getBd
,delBd
Bd
的静态方法。那么你根本不需要App
,你仍然坚持一个概念,一个阶级格言。我确信还有很多其他有效的方法来设置。