赞
踩
单例模式几乎是最常用的设计模式,简单易懂,使用起来效果显著,在此也不对单例模式做剖析,不了解的可以自行查阅资料。
项目中多次使用单例模式后发现每次都是重复的构建单例类,于是做了一个单例模式的模板。
//单例模板 //delete 与 default 来自于 c++ 11 template <typename T> class Singleton { //使用默认构造和析构函数 Singleton() = default; ~Singleton() = default; public: //删除默认的移动、拷贝、赋值、取址 Singleton(Singleton &&) = delete; Singleton(const Singleton &) = delete; void operator = (const Singleton &) = delete; T *operator &() = delete; //获取实例,对此处有异议也可自行查阅资料 static T* instance() { static T object; return &object; } };
使用示例:
//测试类 class Test { int id; public: void setId(int id) { this->id = id; } int getId() const { return this->id; } }; int main() { Singleton<Test>::instance()->setId(5); std::cout << Singleton<Test>::instance()->getId() << std::endl; }
如果使用的时候觉得调用太长,可以将其 #define 一下,如:
#define SingletonTest Singleton<Test>::instance()
使用时短小很多,减少自己手指的损耗,如下:
int main()
{
SingletonTest->setId(5);
std::cout << SingletonTest->getId() << std::endl;
}
宏定义本身是c/c++程序设计中不推荐的做法,关于宏定义是预处理期展开在此也不做赘述,个中利害还需自己斟酌。
为了禁止擅自创建 Test(用户类对象),我们改变下策略:
放开模板限制
在此不再删除取址操作(会影响返回对象的引用),取消模板类构造函数的私有化,作为基类,析构函数标记为virtual;
template <typename T>
class Singleton {
public:
Singleton() = default;
virtual ~Singleton() = default;
Singleton(Singleton &&) = delete;
Singleton(const Singleton &) = delete;
void operator = (const Singleton &) = delete;
static T* instance()
{
static T object;
return &object;
}
};
用户类继承单例模板
与之前不同的是,将创建对象的限制放在了用户类(即将构造函数设置为私有),构造函数私有化后,单例模板也无法创建对象,于是,将单例模板作为友元类;
class Test : public Singleton<Test> { int id; Test() = default; //单例模板作为友元类 friend class Singleton; public: void setId(int id) { this->id = id; } int getId() const { return this->id; } };
示例:
int main()
{
//Test t; //错误,禁止创建对象
Test::instance()->setId(5);
std::cout << Test::instance()->getId();
}
目前想到的方法就是这样,如有更好的的方法,还请留下宝贵的意见。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。