C++ Singleton的实现方法
C++ Singleton的实现方法
- 一、Singleton的实现方法
- 二、定义只能在栈\堆上存在的对象
一、Singleton的实现方法
Singleton模式的要求:一个系统中有且只能有一个指定类的实例
Singleton的一般实现步骤 :
- 将构造函数私有化
- 在类中指定一个静态的指向本类型 的指针变量
- 定义一个返回值为类指针的静态成员函数
代码实现
class Singleton1{private:Singleton1(){printf("constructor\n");}~Singleton1(){printf("destructor\n");};public:static Singleton1* _instance;static Singleton1* getInstance();static void destory();
}
//静态对象初始化
Singleton1* Singleton1::_instance = nullptr;
//定义获取实例的函数和释放实例的函数//风险点在于此函数是线程不安全的,存在多个线程同时进入else 循环创建实例的情况
Singleton1* Singleton1::getInstance(){if(_instance) printf("instance already exist\n");else _instance = new Singleton1();return _instance;
}void Singleton1::destory(){if(_instance==nullptr) printf("instance already deleted\n");else delete _instance;
}
改进方案
- 创建和删除对象指针时,存在线程不安全的情况。考虑以下改进方案
- 在初始化静态变量时,即创建实例,后续函数只能获取其值
- 对静态成员加锁
- 使用Linux pthread库中的pthread_once或C++11中的call_once,规定其执行一次
- 一开始就初始化了静态变量,造成了不必要的空间浪费。可以考虑将其定义在静态函数内部。
class Singleton1{private:Singleton1(){printf("constructor\n");}~Singleton1(){printf("destructor\n");};public:static Singleton1* _instance;static Singleton1* getInstance();static void destory();
}
//静态对象初始化
Singleton1* Singleton1::_instance = nullptr;
//定义获取实例的函数和释放实例的函数//风险点在于此函数是线程不安全的,存在多个线程同时进入else 循环创建实例的情况
Singleton1* Singleton1::getInstance(){if(_instance) printf("instance already exist\n");else _instance = new Singleton1();return _instance;
}void Singleton1::destory(){if(_instance==nullptr) printf("instance already deleted\n");else delete _instance;
二、定义只能在栈\堆上存在的对象
- 只能在栈空间上存在的对象,在栈上可以存在的必要条件时构造函数和析构函数不是private类型。
不能使用new 运算符创建新的类。
所以考虑重载operator new 和 operator delete 并将其作为private成员 - 只能在堆空间上存在的对象:
不能在栈上面创建,可以使用new创建
考虑将其析构函数作为private成员,此时如果在栈上创建对象,则在栈回收时就无法调用相应的析构函数,因此编译器会报错,无法通过。
C++ Singleton的实现方法相关推荐
- 【面试系列】6种单例模式(Singleton)实现方法比较
转载文章,文章经 LiteCodes 授权,转载至本博客. 原文地址:[面试系列]6种单例模式(Singleton)实现方法比较 下述代码均省略了 Singleton 类的业务代码段,仅表现作为单例所 ...
- C++中实现Singleton的正确方法
如果某个类管理了系统中唯一的某种资源,那么我们只能创建该类的一个实例,此时用到singleton设计模式(后面为了简化将省略"设计模式"四个字)就比较合适了.然而,如果不注意实现方 ...
- Laravel Ioc容器singleton和bind方法的区别
Laravel中使用Ioc容器的singleton方法和bind方法创建实例有什么区别呢?它们两个都是返回一个类的实例,不同的是singleton是单例模式,而bind是每次返回一个新的实例,看下面的 ...
- 设计模式——3单例模式(Singleton)
3.单例模式(Singleton) 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比 ...
- 单件模式(Singleton Pattern)
单件模式(Singleton Pattern) 概述 Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点.这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只 ...
- .NET设计模式(2):单件模式(Singleton Pattern)
转载:http://terrylee.cnblogs.com/archive/2005/12/09/293509.html 单件模式(Singleton Pattern) --.NET设计模式系列之二 ...
- 在Java中实现单例模式的有效方法是什么? [关闭]
在Java中实现单例模式的有效方法是什么? #1楼 我使用Spring框架来管理我的单身人士. 它不会强制类的"单一性"(如果涉及多个类加载器,您将无法真正做到),但是它提供了一种 ...
- 设计模式(创建型模式)——单例模式(Singleton)
2019独角兽企业重金招聘Python工程师标准>>> 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这 ...
- 细颗粒度Singleton模式实现
作为一个很典型的设计模式,Singleton模式常常被用来展示设计模式的技巧,并且随着技术的演进,.NET语言和Java都已经把经典<Design Patterns : Elements of ...
最新文章
- 【攻防世界013】elrond32
- java正则表达式匹配数字范围_在java中怎么利用正则表达式匹配数字
- linux下面使用cpdf合并pdf
- python库快速安装_python的pip快速安装代码
- LeetCode-654. 最大二叉树
- 特斯拉已撤回德国电池工厂建厂补贴申请 原有望获得近13亿美元
- SQL Server和Oracle的差异
- PHP 开发邀请功能,使用 larainvite 为 Laravel 5.3 应用添加邀请注册功能
- 2012,字王强势回归
- python是什么意思中文-python是什么意思中文翻译
- 苹果手机越狱后cydia的问题Could not open file - open
- 【0201】用户登录界面设计
- JDK1.6安装_BouncyCastle JCE扩展加密算法解决JDK1.6 sftp连接openssh8.6Algorithm negotiation fail问题
- 汽车零部件行业需求分析及解决方案
- 常用html5阅览器,最好的网页浏览器排行,速度最快的四大浏览器分享
- 编程基本功训练:流程图画法及练习
- 记一次有授权的渗透测试
- 一个所谓的“文字创作者”的焦虑
- 2022-2028年中国祭祀用品行业市场竞争状况及发展趋向分析报告
- Python 实现 GIF 动图以及视频卡通化,两脚踢碎次元壁