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



