我尝试使用单例模式仅连接一次数据库,下面是我的实现。
它能保证 m_connector.connect();
只被调用一次吗?
使用单例是最好的解决方案吗?
class ConnectionManager
{
public:
static ConnectionManager& getManager()
{
static ConnectionManager manager;
return manager;
}
void reconnect();
Connection getConnection();
private:
ConnectionManager():m_connector("port")
{
m_connector.connect();
};
ConnectionManager(ConnectionManager const&);
void operator=(ConnectionManager const&);
Connector m_connector;
};
最佳答案
Will it guarantee that the
m_connector.connect();
only run once?
没有。
在这种实现情况下(也称为 Scott Meyer's Singleton)唯一可以保证的事实是 ConnectionManager
的构造函数被调用一次且仅调用一次。
static ConnectionManager& getManager()
{
static ConnectionManager manager;
return manager;
}
它会在 ConnectionManager::getManager();
第一次被调用时被调用。
构造函数依次调用 m_connector.connect()
ConnectionManager():m_connector("port")
{
m_connector.connect();
};
不能保证
m_connector.connect();
不会从代码的任何其他部分调用。
的声明 void reconnect();
甚至以某种方式暗示。
但是,一切都在您的控制之下。
如果构造函数是唯一调用 m_connector.connect();
的函数,而您担心 thread safety ,你不应该需要。根据当前标准,它保证是线程安全的。
Is using singleton the best solution?
可能不会。没有什么会阻碍您稍后修改您的决定,并决定您确实需要更多 ConnectionManager
实例。
将使用 ConnectionManager::getManager();
的代码的任何其他部分都与该单例类紧密耦合,如果应该使代码更通用,将很难重构代码.
这种硬编码数据库连接
ConnectionManager():m_connector("port")
// ^^^^^^
极大地缩小了应用程序的可扩展性。
我个人会让它成为一个类,使用适当的构造函数参数来创建连接,并实现一个公共(public)(抽象)接口(interface),可以通过工厂函数或其他一些访问 Creational Design Patterns专用于实例创建,仅此而已。
关于c++ - 使用单例仅连接一次数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37168836/