登录企业网站管理系统,网站建设及推广销售话术,广州网页设计美工培训,大连在哪里什么是单例模式#xff1f;
单例模式指在整个系统生命周期里#xff0c;保证一个类只能产生一个实例#xff0c;确保该类的唯一性。
单例模式分类
单例模式可以分为懒汉式和饿汉式#xff0c;两者之间的区别在于创建实例的时间不同#xff1a;
懒汉式#xff1a;指系…什么是单例模式
单例模式指在整个系统生命周期里保证一个类只能产生一个实例确保该类的唯一性。
单例模式分类
单例模式可以分为懒汉式和饿汉式两者之间的区别在于创建实例的时间不同
懒汉式指系统运行中实例并不存在只有当需要使用该实例时才会去创建并使用实例。这种方式要考虑线程安全饿汉式指系统一运行就初始化创建实例当需要时直接调用即可。本身就线程安全没有多线程的问题
单例类特点
构造函数和析构函数为private类型目的禁止外部构造和析构拷贝构造和赋值构造函数为private类型目的是禁止外部拷贝和赋值确保实例的唯一性
单例类的结构 一个public的获取指向唯一的实例对象的指针的函数GetInstance()构造函数析构函数设为private禁止外部构造和析构拷贝构造和赋值操作符重载函数设为private类型禁止外部拷贝和赋值确保实例的唯一性一个private的static的指向唯一的实例对象的指针
懒汉模式实现代码
线程不安全版本 //线程不安全的懒汉模式
class singleClass {
public:static singleClass* getinstance()//对外的接口方法静态成员函数调用静态成员变量{if (instance nullptr){instance new singleClass();}return instance;};private:static singleClass* instance;//静态成员变量类内声明类外初始化singleClass() {} //构造函数属性设置为私有singleClass(const singleClass sc) {} //拷贝构造函数也需要设置为私有
};
singleClass* singleClass::instancenullptr;//初始化静态变量//线程安全的懒汉模式
class lhsingleClass {
public:static lhsingleClass* getinstance(){//双重锁模式if (instance nullptr){//先判断是否为空如果为空则进入不为空说明已经存在实例直接返回//进入后加锁i_mutex.lock();if (instance nullptr){//再判断一次确保不会因为加锁期间多个线程同时进入instance new lhsingleClass();}i_mutex.unlock();//解锁}return instance;}
private:static lhsingleClass* instance;static mutex i_mutex;//锁lhsingleClass(){}lhsingleClass(const lhsingleClass sc) {}//拷贝构造函数也需要设置为私有
};
lhsingleClass* lhsingleClass::instancenullptr;
mutex lhsingleClass::i_mutex;//类外初始化饿汉模式实现代码
//饿汉模式不管用不用得到都构造出来。本身就是线程安全的
class ehsingleClass {
public:static ehsingleClass* getinstance(){return instance;}private:static ehsingleClass* instance;//静态成员变量必须类外初始化只有一个ehsingleClass() {}
};
ehsingleClass* ehsingleClass::instance new ehsingleClass();
//类外定义main开始执行前该对象就存在了