上帝阶级的替代品

时间:2012-02-10 18:25:16

标签: c++ design-patterns singleton

我正在开始一个新的应用程序,它将能够同时连接到不同提供商的许多数据库。

在模式中思考以轻松使用所有连接,我制作了这段代码(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)。与其他连接相同。 即使对我来说也是完美的,每个人都说这是反模式的全部。

如果没有这个“帮助器”类,我怎么能实现几乎相同的结果,并且仍然能够将我的连接/设置共享给所有表单和类,而不向参数/构造函数传递任何内容。

感谢。

1 个答案:

答案 0 :(得分:1)

我会将mpBdList设为Bd的静态私有成员,同样制作getBddelBd Bd的静态方法。那么你根本不需要App,你仍然坚持一个概念,一个阶级格言。我确信还有很多其他有效的方法来设置。