做虚拟币网站需要什么手续,网站建设与推广的销售,做任务的正规网站,国内可用的免费云端服务器链接#xff1a;C 设计模式 链接#xff1a;C 设计模式 - 享元模式
单例模式#xff08;Singleton Pattern#xff09;是创建型设计模式#xff0c;它确保一个类只有一个实例#xff0c;并提供一个全局访问点来访问这个实例。单例模式在需要全局共享资源或控制实例数量的…链接C 设计模式 链接C 设计模式 - 享元模式
单例模式Singleton Pattern是创建型设计模式它确保一个类只有一个实例并提供一个全局访问点来访问这个实例。单例模式在需要全局共享资源或控制实例数量的场景中非常有用例如数据库连接、日志记录器等。
1.问题分析
在开发中有些对象需要全局唯一的实例。例如
配置管理器应用程序的配置通常需要全局唯一的实例以确保配置的一致性。日志记录器日志记录器需要全局唯一的实例以便集中管理日志输出。线程池线程池需要全局唯一的实例以便高效地管理线程资源。数据库连接池数据库连接池需要全局唯一的实例以便复用数据库连接减少连接创建和销毁的开销。
如果这些对象被多次创建会导致以下问题
资源浪费每次创建新实例都会消耗系统资源导致资源浪费。状态不一致多个实例之间的状态可能不一致导致程序行为不可预测。管理复杂多个实例的管理和维护变得复杂增加了代码的复杂性和维护成本。
为了避免上述问题我们需要一种机制来确保某个类只有一个实例并提供一个全局访问点来访问该实例。这就是单例模式的核心需求。
2.实现步骤
私有化构造函数将类的构造函数、拷贝构造函数和赋值运算符设为私有防止外部创建实例。定义静态成员变量用于存储单例对象的唯一实例。提供公共静态方法提供全局访问点来获取单例对象的唯一实例。
3.代码示例
3.1.简单形式
class Singleton {public:// 删除拷贝构造函数和赋值运算符防止复制单例对象Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;// 获取单例实例的公共静态方法static Singleton getInstance() {// 使用局部静态变量来实现线程安全的单例模式static Singleton instance;return instance;}// 示例方法显示单例实例的地址void showMessage() { std::cout Singleton instance address: this std::endl; }private:// 私有构造函数防止外部创建实例Singleton() { std::cout Singleton instance created. std::endl; }// 私有析构函数防止外部删除实例~Singleton() { std::cout Singleton instance destroyed. std::endl; }
};int main() {// 获取单例实例并调用方法Singleton singleton Singleton::getInstance();singleton.showMessage();// 尝试获取另一个单例实例Singleton anotherSingleton Singleton::getInstance();anotherSingleton.showMessage();return 0;
}3.2.指针形式
#include memory
#include mutex
#include stdexceptclass Singleton {public:// 删除拷贝构造函数和赋值运算符防止复制实例Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;// 获取实例的静态方法static Singleton getInstance() {if (!instance) {throw std::logic_error(Instance not yet initialized. Call initInstance() first.);}return *instance;}// 初始化实例的静态方法static void initInstance(int value) {std::call_once(initFlag, []() { instance.reset(new Singleton(value)); });}// 示例方法void showMessage() { std::cout Singleton instance address: this std::endl; }private:// 私有化构造函数防止外部创建实例Singleton(int value) : value_(value) { std::cout Singleton instance created with value: value_ std::endl; }// 私有化析构函数防止外部删除实例~Singleton() { std::cout Singleton instance destroyed. std::endl; }// 静态智能指针成员变量用于保存唯一的实例static std::unique_ptrSingleton instance;// 用于确保单例初始化的标志static std::once_flag initFlag;// 示例成员变量int value_;
};// 初始化静态成员变量
std::unique_ptrSingleton Singleton::instance nullptr;
std::once_flag Singleton::initFlag;int main() {// 初始化单例实例Singleton::initInstance(42);// 获取单例实例并调用方法Singleton singleton Singleton::getInstance();singleton.showMessage();// 再次获取单例实例并调用方法Singleton singleton2 Singleton::getInstance();singleton2.showMessage();return 0;
}