C++学习笔记(十)
?
前言
? ? ? ? 随着技术的革新,出现各种各样的编程语言,C++就是其中之一,作为最受欢迎的编程语言之一,C++带给开发者们最大的惊喜便是其强大的特性。一方面跟C兼容,可以直面系统底层API,SDK,另一方面提供了很多范式,足够的抽象能力,面向对象,操作符重载,模板等。本章将接着之前的学习笔记继续向下整理知识点,本篇的主要内容为C++的常用设计模式中的单例设计模式
提示:以下是本篇文章正文内容,下面案例可供参考
一、单例设计模式
? ? ? ? C++有着23种设计模式,包括工厂方式模式、抽象工厂模式、单例设计模式、建造这模式、观察者模式等。
1.1 单例设计模式的定义
? ? ? ? 一个类型在定义对象的时候有且只有一个对象叫做单例
1.2 单例设计模式的思想
? ? ? ? ① 不可以从外部调用类的构造函数,必须把构造函数私有化
? ? ? ? ② 使用公有权限下定义的函数? ?但是如果定义的函数是普通类型的函数,则需要以来对象才可以调用,这样就和单例的定义产生冲突,所以必须,把这个函数升级为静态函数。
? ? ? ? ③ 当函数升级成为静态函数,函数就没有this指针,无法调取类中属性,素以需要把类中该属性升级为静态属性。
? ? ? ? ④ 把类中的本类的指针,升级为静态属性。并在类外完成初始化,初始化则给定一个唯一的实例.
1.3 单例设计模式的两种类型
? ? ? ? 1.3.1 饿汉式? ? ? ?
class A
{
private:
//4.类单例类型的类中提供一静态指针:
static A* my_Instance;
//1.把构造函数私有化:
A()
{
cout << "A构造" << endl;
}
public:
//2.使用一个公有接口函数返回一个实例:
//3.把这个公有接口函数升级static静态成员方法:
static A* get_Instance()
{
//在公有接口返回。
return my_Instance;
}
};
A* A::my_Instance = new A();
? ? ? ? 注意:饿汉式中有一种缺点,那就是当定义的单例过多的时候,采用饿汉式这种写法会导致开辟了很多个空间用来保存初始化的数据,最直观的感受就是会导致,程序跑起来的速度变慢。
???????? 1.3.2 懒汉式
mutex suo;
class A
{
//4.在单例类型的类中定义静态指针
static A* my_Instance;
private:
//1.把构造函数私有化:
A()
{
cout << "A构造" << endl;
}
public:
//2.使用一个公有接口函数返回实例
//3.把这个公有接口函数升级成为static修饰的静态成员方法:
static A* get_Instance()
{
if(my_Instance == nullptr)
{
//锁+双条件判断:轻量级锁:
lock_guard<mutex> lock(suo);
if(my_Instance == nullptr)
{
my_Instance = new A();
}
}
return my_Instance;
}
//懒汉式析构:
~A()
{
cout << "A析构" << endl;
}
//懒汉式单例释放空间要单独写一个函数
static void destory()
{
delete my_Instance;
}
};
? ? ? ? 注意:当采用懒汉式的这种写法时,只是比饿汉式多了一个判断条件,用来判断实例是否为空。当实例不为为空,调用构造时,并且返回值还没传回时,会存在着另几个线程到达的情况,此时就会出现问题,所以在上述代码中引入了锁的概念,使得在判断为真后,执行代码的期间内,让其他的线程在此等候,避免出现问题。
????????注意:当使用单例设计模式的时候,为了使单例设计模式更加安全可靠,C++11提供的新功能:把默认拷贝构造与=运算符重删除,此条通常放在私有权限下。?
//C++11提供的新功能:把默认拷贝构造与=运算符重删除。
Singleton(const Singleton& other) = delete;
void operator=(const Singleton& other) = delete ;
总结
????????以上就是今天要讲的内容,本文仅仅简单介绍了单例设计模式的设计方法和两种设计格式,并分别举了饿汉式和懒汉式的代码写法。希望对大家有所帮助,当然如果本文中有写的不对的地方,或者有更好的理解方式,欢迎私信与我或在评论区中指出,谢谢。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!