私は新しいプロバイダを使い始めています。これは、同時にさまざまなプロバイダの多くのデータベースに接続できるようになります。簡単にすべての接続を使用するパターンで考える神のクラスの代わりに
、私はこのコード(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)にアクセスできます。他の接続と同じです。 私にとっても完璧です、皆はそれがアンチパターンであり、すべてであると言っています。
この「ヘルパー」クラスがなくても、ほとんど同じ結果を得ることができますが、パラメータ/コンストラクタに何も渡さずに、すべてのフォームとクラスに接続/設定を共有できます。
ありがとうございました。
あなたは新しく電話する必要はありません。スタックにオブジェクトを作成するだけです。例えば。 'App app;'または 'std :: map mpBdList;' –