学校网站建设总结报告,国家企业信息认证系统,wordpress加载速度太慢,网上怎么推销自己的产品1. 模式说明
单例模式保证类只有一个实例#xff1b;创建一个对象#xff0c;当你创建第二个对象的时候#xff0c;此时你获取到的是已经创建过的对象#xff0c;而不是一个新的对象#xff1b;
1.1 使用场景
共享资源的访问权限#xff1b;任务的管理类#xff1b;数…1. 模式说明
单例模式保证类只有一个实例创建一个对象当你创建第二个对象的时候此时你获取到的是已经创建过的对象而不是一个新的对象
1.1 使用场景
共享资源的访问权限任务的管理类数据库的操作等
1.2 要素
私有化类的构造函数使用类的私有静态指针变量指向类的唯一实例公有静态方法获取该实例
1.3 类型
懒汉模式饿汉模式
2. 懒汉模式
单例实例在第一次被使用时才进行初始化延迟初始化
2.1 基本
示例
/** brief : design patterns singleton* author : your name* compile : g -g singleton_main.cc -o d -stdc11* date : 2023/04/18* lastEditorDate: */#include iostream
#include string//懒汉模式
class Singleton
{
public:static Singleton* getSingletonInstance() //访问函数{if(instance nullptr){instance new Singleton;}return instance;}public:void addCount() {m_count;}int32_t getCount() {return m_count;}private:static Singleton* instance; //静态指针变量Singleton(){} //私有化类的构造函数int32_t m_count{0};
};Singleton* Singleton::instance nullptr; //静态成员类外初始化int main(int argc, char* argv[])
{Singleton* single_0 Singleton::getSingletonInstance();single_0-addCount();std::coutsingle_0 value is: single_0-getCount()std::endlstd::endl;Singleton* single_1 Singleton::getSingletonInstance();single_1-addCount();std::coutsingle_0 value is: single_0-getCount()std::endl;std::coutsingle_1 value is: single_1-getCount()std::endlstd::endl; return 0;
}输出
single_0 value is: 1single_0 value is: 2
single_1 value is: 22.2 线程安全
2.1中的示例是线程不安全的假如有多个线程同时调用getSingletonInstance()此时检测到instance是nullptr就会导致单例的崩溃造成内存泄漏
通过加锁来实现 示例
/** brief : design patterns singleton* author : your name* compile : g -g singleton_main.cc -o d -stdc11* date : 2023/04/18* lastEditorDate: */#include iostream
#include string
#include mutex//懒汉模式
std::mutex mtx; //全局的锁
class Singleton
{
public:static Singleton* getSingletonInstance() //访问函数{if(instance nullptr){std::lock_guardstd::mutex guard(mtx); if(instance nullptr){instance new Singleton;} }return instance;}public:void addCount() {m_count;}int32_t getCount() {return m_count;}private: static Singleton* instance; //静态指针变量Singleton(){} //私有化类的构造函数int32_t m_count{0};
};
Singleton* Singleton::instance nullptr; //静态成员类外初始化int main(int argc, char* argv[])
{Singleton* single_0 Singleton::getSingletonInstance();single_0-addCount();std::coutsingle_0 value is: single_0-getCount()std::endlstd::endl;Singleton* single_1 Singleton::getSingletonInstance();single_1-addCount();std::coutsingle_0 value is: single_0-getCount()std::endl;std::coutsingle_1 value is: single_1-getCount()std::endlstd::endl; return 0;
}输出
single_0 value is: 1single_0 value is: 2
single_1 value is: 2使用 c11 中局部静态变量是线程安全的性质
示例
/** brief : design patterns singleton* author : your name* compile : g -g singleton_main.cc -o d -stdc11* date : 2023/04/18* lastEditorDate: */#include iostream
#include string
#include mutex//懒汉模式
class Singleton
{
public:static Singleton* getSingletonInstance() //访问函数{static Singleton instance; //静态指针变量return instance;}public:void addCount() {m_count;}int32_t getCount() {return m_count;}private: Singleton(){} //私有化类的构造函数int32_t m_count{0};
};int main(int argc, char* argv[])
{Singleton* single_0 Singleton::getSingletonInstance();single_0-addCount();std::coutsingle_0 value is: single_0-getCount()std::endlstd::endl;Singleton* single_1 Singleton::getSingletonInstance();single_1-addCount();std::coutsingle_0 value is: single_0-getCount()std::endl;std::coutsingle_1 value is: single_1-getCount()std::endlstd::endl; return 0;
}输出
single_0 value is: 1single_0 value is: 2
single_1 value is: 23. 饿汉模式
指单例实例在程序运行时被立即执行初始化
示例
/** brief : design patterns singleton* author : your name* compile : g -g singleton_main.cc -o d -stdc11* date : 2023/04/18* lastEditorDate: */#include iostream
#include string
#include mutex//饿汉模式
class Singleton
{
public:static Singleton* getSingletonInstance() //访问函数{ return instance;}public:void addCount() {m_count;}int32_t getCount() {return m_count;}private:static Singleton* instance; //静态指针变量Singleton(){} //私有化类的构造函数int32_t m_count{0};
};Singleton* Singleton::instance new Singleton; //静态成员类外初始化int main(int argc, char* argv[])
{Singleton* single_0 Singleton::getSingletonInstance();single_0-addCount();std::coutsingle_0 value is: single_0-getCount()std::endlstd::endl;Singleton* single_1 Singleton::getSingletonInstance();single_1-addCount();std::coutsingle_0 value is: single_0-getCount()std::endl;std::coutsingle_1 value is: single_1-getCount()std::endlstd::endl; return 0;
}输出
single_0 value is: 1single_0 value is: 2
single_1 value is: 24. 在开发过程中的使用
在项目的使用过程中可以将单例设计成为类模板这样其它类在设计的时候不用考虑是否需要将其设计成为单例
其它类如果需要单例属性只需要通过单例模板对其进行赋能即可
示例
/** brief : design patterns singleton* author : your name* compile : g -g singleton_main.cc -o d -stdc11* date : 2023/04/18* lastEditorDate: */#include iostream
#include string
#include mutextemplateclass T
class Singleton
{
public:static T* getSingletonInstance() //访问函数{static T instance; //静态指针变量return instance;}
private: Singleton(){} //私有化类的构造函数
};class C1
{
public:void addCount() {m_count;}int32_t getCount() {return m_count;} private: int32_t m_count{0};
};int main(int argc, char* argv[])
{auto re1 SingletonC1::getSingletonInstance();re1-addCount();std::coutre1-getCount() value is: re1-getCount()std::endl;auto re2 SingletonC1::getSingletonInstance();re2-addCount();std::coutre1-getCount() value is: re1-getCount()std::endl;std::coutre2-getCount() value is: re2-getCount()std::endl;return 0;
}输出 re1-getCount() value is: 1
re1-getCount() value is: 2
re2-getCount() value is: 2