青菜

注册

 

发新话题 回复该主题

C设计模式Singleton的侵入式 [复制链接]

1#
白癜风最好治疗方法         https://m-mip.39.net/nk/mipso_4786531.html
C++设计模式Singleton的侵入式和声明式

本期给出Singleton的最后玩法,Singleton的宏与模板,用于方便定义一个类为Singleton,少写几行代码。前面给出的Singleton玩法有:

C++设计模式Singleton初探

C++设计模式Singleton的资源释放优化

C++设计模式Singleton的线程安全初探

C++设计模式Singleton的线程安全深入

Singleton的宏定义,通常是一种代码侵入的方式,即在原有类中植入宏代码。而Singleton的模板定义,是一种非代码侵入的声明式(我这样称呼的),在类外部添加声明代码即,而非改变原有的类。两者也有差异,Singleton的宏定义可以控制原有类的构造,而Singleton的声明式不能。如果看过C++设计模式Singleton初探,就了解这意味着什么。

1.Singleton侵入式

Singleton的宏定义,与前面提到的各种姿式的Singleton相结合,会组合出各种各样的实现。下面给出两种常用的宏定义方式,局部静态变量宏和unique_ptr宏。

1)局部静态变量宏

#defineSINGLETON_CLASS(ClassName)\private:\ClassName()=default;\ClassName(constClassName)=delete;\ClassNameoperator=(constClassName)=delete;\public:\staticClassNamegetInstance(){\staticClassNameone;\returnone;\}

使用样例:

#include"singleton.h"classSingleton{SINGLETON_CLASS(Singleton)public:private:};2)unique_ptr宏

#defineSINGLETON_DECLARE(ClassName)\private:\ClassName(){}\ClassName(constClassName){}\ClassNameoperator=(constClassName){}\staticstd::unique_ptrClassNames_instance;\public:\staticClassName*getInstance(void);#defineSINGLETON_DEFINE(ClassName)\std::unique_ptrClassNameClassName::s_instance=nullptr;\ClassName*ClassName:etInstance(void)\{\if(nullptr==s_instance){\s_instance.reset(newClassName());\}\returns_instance.get();\}

使用样例Singleton:etInstance():

#include"singleton.h"classSingleton{SINGLETON_DECLARE(Singleton)public:private:};SINGLETON_DEFINE(Singleton)2.Singleton声明式

该方式利用了C++的模板,将原有的类的对象封装在一个Singleton的对象中,不改变原有类的内部代码。因此,需要对该类命名一个对应的Singleton名字,如Test类对应的Singleton名字为TestSingleton,用TestSingleton::instance()来获取Test的单例对象。

#defineMAKE_SINGLETON(SingletonName,ClassName)\classClassName;\usingSingletonName=SingletonClassName;templatetypenameTclassSingleton{public:virtual~Singleton()=default;staticTinstance(){if(nullptr==m_instance){m_instance.reset(newT);}return*m_instance.get();}private:Singleton(){}Singleton(constSingleton)=delete;Singletonoperator=(constSingleton)=delete;Singleton(Singleton)=delete;Singletonoperator=(Singleton)=delete;staticstd::unique_ptrTm_instance;};templatetypenameTstd::unique_ptrTSingletonT::m_instance=nullptr;

使用样例Testtest=TestSingleton::instance();/p>

#include"singleton.h"MAKE_SINGLETON(TestSingleton,Test)classTest{public:private:};3.Theend

NOTE:前面给出的Singleton侵入式和Singleton声明式都是单线程场景下的应用方式,自行脑补多线程场景下的使用姿态就好。

SeanwithPhD

分享 转发
TOP
发新话题 回复该主题