如何实现一个单实例的管理类

2019-03-24  本文已影响0人  crazyhank

很多人用C++语言开发软件的时候,一般都会碰到要实现一个管理类,并且一般来说一个系统只允许存在一个管理类的对象,这就需要将管理类设计成单实例模式。如何实现单实例模式,这是一个非常传统的设计模式问题,但是很多程序员都不太清楚,这里以一个简单的示例代码来说明。

首先,我们来定义一个管理类:

$vim manager.hpp

#ifndef MANAGER
#define MANAGER

class manager {
public:
        static manager* getInstance();
private:
        manager();
        virtual ~manager();

        static manager* instance;

};
#endif

为了防止用户使用manager类进行创建对象,我们将类的构造函数和析构函数都定义成private属性。并且,在这里定义了公开的静态成员函数getInstance用于获取单实例对象,而这里的单实例对象其实是保存在一个静态成员变量instance中的,而且它也是private属性的。

然后我们来看看这个manager类的实现代码:

$ vim manager.cpp

#include <iostream>
#include "manager.hpp"

using namespace std;


manager* manager::instance = nullptr;

manager::manager()
{

}

manager::~manager()
{

}


manager* manager::getInstance()
{
        if (instance == nullptr) {
                cout << "creating new instance..." << endl;
                instance = new manager();
        }

        return instance;
}

这里需要注意的时候类头文件中声明的静态成员变量必须在实现代码中初始化。

可以看到getInstance的实现代码中永远返回的是同一个instance实例。

最后我们写一个main函数测试运行下:

$vim main.cpp

#include <iostream>
#include "manager.hpp"

using namespace std;
int main()
{
        manager* mgr1 = manager::getInstance();

        manager* mgr2 = manager::getInstance();

        //manager* mgr3 = new manager();  //不能调用new函数了,因为是private属性了

        if (mgr1 == mgr2) {
                cout << "mgr1 == mgr2" << endl;
        }

        return 0;
}

$ ./main
creating new instance...
mgr1 == mgr2

上一篇 下一篇

猜你喜欢

热点阅读