c++11 改进设计模式 Singleton模式
关于学习 《深入应用c++11》的代码笔记:
c++11之前是这么实现的
template<typename T>
class Singleton{
public:
static T* Instance(){
if (m_pInstance == nullptr)
m_pInstance = new T();
return m_pInstance;
} template<typename T0>
static T* Instance(T0 arg0){
if (m_pInstance == nullptr)
m_pInstance = new T(arg0);
return m_pInstance;
} template<typename T0,typename T1>
static T* Instance(T0 arg0, T1 arg1){
if (m_pInstance == nullptr)
m_pInstance = new T(arg0, arg1);
return m_pInstance;
} template<typename T0, typename T1,typename T2>
static T* Instance(T0 arg0, T1 arg1,T2 arg2){
if (m_pInstance == nullptr)
m_pInstance = new T(arg0, arg1,arg2);
return m_pInstance;
} template<typename T0, typename T1, typename T2,typename T3>
static T* Instance(T0 arg0, T1 arg1, T2 arg2,T3 arg3){
if (m_pInstance == nullptr)
m_pInstance = new T(arg0, arg1, arg2,arg3);
return m_pInstance;
} template<typename T0, typename T1, typename T2, typename T3,typename T4>
static T* Instance(T0 arg0, T1 arg1, T2 arg2, T3 arg3,T4 arg4){
if (m_pInstance == nullptr)
m_pInstance = new T(arg0, arg1, arg2, arg3,arg4);
return m_pInstance;
} template<typename T0, typename T1, typename T2, typename T3, typename T4,typename T5>
static T* Instance(T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4,T5 arg5){
if (m_pInstance == nullptr)
m_pInstance = new T(arg0, arg1, arg2, arg3, arg4,arg5);
return m_pInstance;
} static T* GetInstance()
{
if (m_pInstance == nullptr)
throw std::logic_error("the instance is not init,please init the instance first"); return m_pInstance;
} static void DestroyInstance(){
delete m_pInstance;
m_pInstance = nullptr;
} private:
Singleton(void);
virtual ~Singleton(void);
Singleton(const Singleton&);
Singleton& operator = (const Singleton); static T* m_pInstance;
}; template<class T> T* Singleton<T>::m_pInstance = nullptr; //============================================
struct A{
A(){}
}; struct B{
B(int x){}
}; struct C{
C(int x, double y){}
}; int _tmain(int argc, _TCHAR* argv[])
{
Singleton<A>::Instance();
Singleton<A>::Instance();
Singleton<B>::Instance(1);
Singleton<C>::Instance(1,3.14); Singleton<A>::DestroyInstance();
Singleton<B>::DestroyInstance();
Singleton<C>::DestroyInstance(); return 0;
}
c++11之后可以简略一点,使用了可变模板参数
template<typename T>
class Singleton{
public:
template <typename... Args>
static T* Instance(Args&&... args){
if (m_pInstance == nullptr)
m_pInstance = new T(std::forward<Args>(args)...);
return m_pInstance;
} static T* GetInstance(){
if (m_pInstance == nullptr)
throw std::logic_error("the instance is not init,please initialize the instance first");
return m_pInstance;
} static void DestroyInstance()
{
delete m_pInstance;
m_pInstance = nullptr;
} private:
Singleton(void);
virtual ~Singleton(void);
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);
private:
static T* m_pInstance;
}; template<class T>T* Singleton<T>::m_pInstance = nullptr; #include <iostream>
#include <string> using namespace std; struct A{
A(const string&){ cout << "lvalue" << endl; }
A(string&&x){ cout << "rvalue" << endl; }
}; struct B{
B(const string&){ cout << "lvalue" << endl; }
B(string&& x){ cout << "rvalue" << endl; }
}; struct C{
C(int x, double y){}
void Fun(){ cout << "Test" << endl; }
}; int _tmain(int argc, _TCHAR* argv[])
{
string str = "bb";
Singleton<A>::Instance(str);
Singleton<B>::Instance(std::move(str));
Singleton<C>::Instance(1,3.14);
Singleton<C>::GetInstance()->Fun(); Singleton<A>::DestroyInstance();
Singleton<B>::DestroyInstance();
Singleton<C>::DestroyInstance(); return 0;
}
c++11 改进设计模式 Singleton模式的更多相关文章
- (原创)c++11改进我们的模式之改进访问者模式
本次讲c++11改进我们的模式之改进访问者模式 访问者模式是GOF23个设计模式中比较复杂的模式之一,但是它的功能也很强大,非常适合稳定的继承层次中对象的访问,可以在不修改被访问对象的情况下,动态添加 ...
- (原创)c++11改进我们的模式之改进命令模式
模式虽然精妙,却难完美,比如观察者模式中观察者生命周期的问题:比如访问者模式中循环依赖的问题等等:其它很多模式也存在这样那样的一些不足之处,如使用场景受限.实现复杂.不够简洁.不够通用等.但我觉得不足 ...
- (原创)c++11改进我们的模式之改进单例模式
我会写关于c++11的一个系列的文章,会讲到如何使用c++11改进我们的程序,本次讲如何改进我们的模式,会讲到如何改进单例模式.观察者模式.访问者模式.工厂模式.命令模式等模式.通过c++11的改进, ...
- (原创)c++11改进我们的模式之改进代理模式,实现通用的AOP框架
c++11 boost技术交流群:296561497,欢迎大家来交流技术. 本次要讲的时候如何改进代理模式,具体来说是动态代理模式,动态代理模式一般实现AOP框架,不懂AOP的童鞋看这里.我前面的博文 ...
- 1.设计模式 - Singleton模式(单件模式)
Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点,一般用于Activity的控制层全局对象和Singl ...
- (原创)c++11改进我们的模式之改进表驱动模式
所谓表驱动法(Table-Driven Approach),简单讲是指用查表的方法获取值.表驱动是将一些通过较为复杂逻辑语句来得到数据信息的方式,通过查询表的方式来实现,将数据信息存放在表里.对于消除 ...
- (原创)c++11改进我们的模式之改进观察者模式
和单例模式面临的是同样的问题,主题更新的接口难以统一,很难做出一个通用的观察者模式,还是用到可变模板参数解决这个问题,其次还用到了右值引用,避免多余的内存移动.c++11版本的观察者模式支持注册的观察 ...
- 转:Singleton模式
C++完美实现Singleton模式 转自:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html boost库的Singleton的实现 ...
- Java设计模式(2)单态模式(Singleton模式)
定义:Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作. 还有,singleton能够被状态化 ...
随机推荐
- (16/24) webpack打包后的调试方法
在程序开发中,调试程序是最频繁的,那使用了webpack后,所有的代码都打包到了一起,这给调试带来了困难,但是webpack在设计时就已经考虑好了这点,它支持生产Source Maps来方便我们的调试 ...
- redis、memcache和mongodb各自的优缺点是什么
redis.memcahce 比较相似,但与 mongodb 完全不同,几乎没有可比性. 总的来说 redis/memcache 是基于内存的,讲究的是性能,多用作缓存层,比如说存放session.而 ...
- php 面试考点总结-高并发和大流量解决方案考点
1.web资源防盗链 盗链概念 盗链是指在自己的页面上展示一些并不在自己服务器的内容 防盗链工作原理 通过referer或者签名,网站可以检测目标网页访问的来源页,一旦检测到来源页不是本站即进行阻止或 ...
- git 提交文件到gitee
1.新建文件夹 打开gitbash 初始化仓库 git.init 2.把要提交的文件copy到文件夹 3.git add. 4.git remote add master(分支) 远程仓库 5 ...
- 机器学习入门-贝叶斯构造LDA主题模型,构造word2vec 1.gensim.corpora.Dictionary(构造映射字典) 2.dictionary.doc2vec(做映射) 3.gensim.model.ldamodel.LdaModel(构建主题模型)4lda.print_topics(打印主题).
1.dictionary = gensim.corpora.Dictionary(clean_content) 对输入的列表做一个数字映射字典, 2. corpus = [dictionary,do ...
- JVM jstat 详解
http://www.ityouknow.com/java/2017/03/01/jvm-overview.html 本文基于JDK1.8 https://blog.csdn.net/maosijun ...
- C++ 实现的netstat -an 的功能<转>-目的为获取rtmp推流地址如果是域名的话查看1935的ip
目的可能是为了获取rtmp真正的推流ip 如果rtmp推流地址是域名,往CDN推流的话,需要nslookup 的那种DNS解析,然后获取的几个ip 可以使用netstat -n 等命令查看 1935 ...
- ios present NavigationController
ViewController *testViewController = [[DashboardTableViewController alloc]initWithNibName:@"tes ...
- 磁盘IO过高时的处理办法
针对系统中磁盘IO负载过高的指导性操作 主要命令:echo deadline > /sys/block/sda/queue/scheduler 注:以下的内容仅是提供参考,如果磁盘IO确实比较大 ...
- Quartz+TopShelf实现Windows服务作业调度
Quartz:首先我贴出来了两段代码(下方),可以看出,首先会根据配置文件(quartz.config),包装出一个Quartz.Core.QuartzScheduler instance,这是一个调 ...