单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。这有助于控制资源的共享,以及限制对特定资源的访问权限。在单例模式中,通常通过私有构造函数和静态方法来实现。
懒汉式(Lazy Initialization):
懒汉式是指在第一次请求实例时才创建实例。这种方式避免了在程序启动时就创建对象,延迟了对象的实例化时间。
C++懒汉式单例模式示例:
#include <iostream>
class SingletonLazy {
private:
static SingletonLazy *instance;
// 私有构造函数,防止外部直接实例化
SingletonLazy() {}
public:
// 获取实例的静态方法
static SingletonLazy *getInstance() {
if (instance == nullptr) {
instance = new SingletonLazy();
}
return instance;
}
// 其他成员方法
void showMessage() {
std::cout << "Hello from SingletonLazy!" << std::endl;
}
};
// 在程序开始时,静态成员需要在类外初始化
SingletonLazy *SingletonLazy::instance = nullptr;
int main() {
SingletonLazy *lazyInstance1 = SingletonLazy::getInstance();
lazyInstance1->showMessage();
SingletonLazy *lazyInstance2 = SingletonLazy::getInstance();
// 判断是否是同一个实例
if (lazyInstance1 == lazyInstance2) {
std::cout << "Both instances are the same." << std::endl;
} else {
std::cout << "Instances are different." << std::endl;
}
return 0;
}
饿汉式(Eager Initialization):
饿汉式是指在类加载的时候就创建实例,因此无论是否需要都会创建一个实例。这种方式在多线程环境下需要小心,可能会导致资源浪费。
C++饿汉式单例模式示例:
#include <iostream>
class SingletonEager {
private:
// 在类加载时就创建实例
static SingletonEager *instance;
// 私有构造函数,防止外部直接实例化
SingletonEager() {}
public:
// 获取实例的静态方法
static SingletonEager *getInstance() {
return instance;
}
// 其他成员方法
void showMessage() {
std::cout << "Hello from SingletonEager!" << std::endl;
}
};
// 在程序开始时,静态成员需要在类外初始化
SingletonEager *SingletonEager::instance = new SingletonEager();
int main() {
SingletonEager *eagerInstance1 = SingletonEager::getInstance();
eagerInstance1->showMessage();
SingletonEager *eagerInstance2 = SingletonEager::getInstance();
// 判断是否是同一个实例
if (eagerInstance1 == eagerInstance2) {
std::cout << "Both instances are the same." << std::endl;
} else {
std::cout << "Instances are different." << std::endl;
}
return 0;
}
区别:
-
初始化时机:
选择懒汉式还是饿汉式取决于具体的需求和性能要求。如果资源消耗不是问题且希望避免潜在的线程安全问题,饿汉式可能是一个不错的选择。如果希望延迟实例化并避免不必要的资源浪费,懒汉式可能更合适。
原文地址:https://blog.csdn.net/weixin_57111012/article/details/134693677
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_35962.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。