如何将C语言中的单例类模板改写为长尾?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1667个文字,预计阅读时间需要7分钟。
单例模式是简单的设计模式之一。在实际工程中,如果一个类的对象拥有大量资源且重复存在成本很高,且其外部接口是线程安全的,我们会倾向于使用单例模式来管理。本文将在C++中实现单例模式。
单例模式是最简单的设计模式之一。在实际工程中,如果一个类的对象重复持有资源的成本很高,且对外接口是线程安全的,我们往往倾向于将其以单例模式管理。
此篇我们在 C++ 中实现正确的单例模式。
选型
在 C++ 中,单例模式有两种方案可选。
- 一是实现一个没有可用的公开构造函数的基类,并提供 GetInstance 之类的静态接口,以便访问子类唯一的对象。由于子类构造必须调用基类构造,但基类无公开构造函数可用,这使得子类对象只能由基类及基类的友元来构造,从而在机制上保证单例。
- 二是实现一个类模板,其模板参数是希望由单例管理的类的名字,并提供 GetInstance 之类的静态接口。这种做法的好处是希望被单例管理的类,可以自由编写,而无需继承基类;并且在需要的时候,可以随时脱去单例外衣。
此篇选择实现一个单例类模板,其形如:
template <typename T> struct Singleton { static T* get(); T* operator->() const { return get(); } };
这里重载成员访问运算符,是为了可以实现这样的简写 Singleton<T>()->func()。
显然,单例的实现核心在于静态成员函数 T* get()。
本文共计1667个文字,预计阅读时间需要7分钟。
单例模式是简单的设计模式之一。在实际工程中,如果一个类的对象拥有大量资源且重复存在成本很高,且其外部接口是线程安全的,我们会倾向于使用单例模式来管理。本文将在C++中实现单例模式。
单例模式是最简单的设计模式之一。在实际工程中,如果一个类的对象重复持有资源的成本很高,且对外接口是线程安全的,我们往往倾向于将其以单例模式管理。
此篇我们在 C++ 中实现正确的单例模式。
选型
在 C++ 中,单例模式有两种方案可选。
- 一是实现一个没有可用的公开构造函数的基类,并提供 GetInstance 之类的静态接口,以便访问子类唯一的对象。由于子类构造必须调用基类构造,但基类无公开构造函数可用,这使得子类对象只能由基类及基类的友元来构造,从而在机制上保证单例。
- 二是实现一个类模板,其模板参数是希望由单例管理的类的名字,并提供 GetInstance 之类的静态接口。这种做法的好处是希望被单例管理的类,可以自由编写,而无需继承基类;并且在需要的时候,可以随时脱去单例外衣。
此篇选择实现一个单例类模板,其形如:
template <typename T> struct Singleton { static T* get(); T* operator->() const { return get(); } };
这里重载成员访问运算符,是为了可以实现这样的简写 Singleton<T>()->func()。
显然,单例的实现核心在于静态成员函数 T* get()。

