确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法
单例模式提供了对唯一实例的受控访问。因为单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它。
由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
允许可变数目的实例。基于单例模式我们可以进行扩展,使用与单例控制相似的方法来获得指定个数的对象实例,既节省系统资源,又解决了单例单例对象共享过多有损性能的问题
由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。
单例类的职责过重,在一定程度上违背了“单一职责原则”。因为单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法,将产品的创建和产品的本身的功能融合到一起.
1.即然外部不可以定义对象,也就是说是不可以从外部调到类的构造函数,所以就必须把构造函数私有 化, 但是私有化带来的问题是,在外部一个对象也定义不出来了。 所以必须在类内定义一个公开的接口,返回本类对象的指针。
2.即使用public权限下定义一函数,返回出本类对象的指针。 但是,如果这个函数是一个普通函数的话,那么他还是依赖于类对象的调用才可以,这又与只产生一 个单例相矛盾了。 所以必须,把这个函数升级为静态函数。
3.把这个函数升级为静态函数。 但是,升级为静态函数之后呢?函数就没有this指针,无法调取类中属性,所以也要把类中这个属性升 级为静态属性。
4.把类中的本类的指针,升级为静态属性。
当我不需要是他也已经构建好了,白白占有一块内存空间,对于C++精益求精的个性 来讲不合适。
- #include
-
- using namespace std;
-
- class Singleton{
- static Singleton *singleton;
- Singleton()
- {
- cout<<"这是一个无参构造"<
- }
-
- ~Singleton()
- {
- cout<<"这是析构"<
- }
- public:
- static Singleton* getinstence()
- {
- return singleton;
- }
-
- void show_info()
- {
- cout<<this<
- }
-
- //将编译器自动提供的拷贝构造与等号运算符重载移除掉
- Singleton(const Singleton& other)=delete ;
- void operator=(const Singleton& other)=delete ;
- };
-
- Singleton* Singleton::singleton=new Singleton;
-
- int main()
- {
- Singleton *s1=Singleton::getinstence();
- s1->show_info();
- Singleton *s2=Singleton::getinstence();
- s2->show_info();
- Singleton *s3=Singleton::getinstence();
- s3->show_info();
-
- return 0;
- }
3.1.3结果图

说明定义的三个地址都是一样的,所以实现了单列设计模式。
3.2懒汉式
3.2.1缺点
3.2.2代码实现
- #include
- #include
-
- using namespace std;
- mutex mtx;
-
- class Singleton{
- static Singleton* singleton;
-
- Singleton()
- {
- cout<<"这是一个无参构造"<
- }
-
- ~Singleton()
- {
- cout<<"这是析构"<
- }
- public:
- static Singleton* get_instence()
- {
- lock_guard
lock(mtx) ; - if(singleton==nullptr){
- singleton=new Singleton;
- }
-
- return singleton;
- }
-
- void show_info()
- {
- cout<<this<
- }
-
- static void destroy()
- {
- if(singleton!=nullptr){
- delete singleton;
- }
- }
- };
-
- Singleton* Singleton::singleton=nullptr;
-
- int main()
- {
-
- Singleton *s1=Singleton::get_instence();
- s1->show_info();
- Singleton *s2=Singleton::get_instence();
- s2->show_info();
- Singleton *s3=Singleton::get_instence();
- s3->show_info();
-
- Singleton::destroy();
- return 0;
- }
3.2.3结果图和上面一样
-
相关阅读:
VB.net读写S50/F08IC卡,修改卡片密码控制位源码
【接口缓存】Alibaba - JetCache
Oracle(6) Control File
什么是大模型微调?微调的分类、方法、和步骤
hive中建立MySQL表格时有乱码
美食推荐|美食推荐小程序|基于微信小程序的美食推荐系统设计与实现(源码+数据库+文档)
344. Reverse String
以命令行形式执行Postman脚本(使用Newman)
什么是JVM?JVM的机制与JVM自动内存管理机制,如何进行优化
进一步了解视频美颜SDK:美颜SDK的技术原理
-
原文地址:https://blog.csdn.net/a2998658795/article/details/126002419