【C++设计模式】单例模式

一、单例模式优点及适用场景

单例模式特点:保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。

实现策略:

  • 1.单例模式的类只提供私有的构造函数
  • 2.类定义中含有一个该类的静态私有对象
  • 3.该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象

实现方法:饿汉式单例(开始即初始化单例对象)、懒汉式单例(需要时再实例化单例对象)

优点:

  • 1.在内存中只有一个对象,节省内存空间
  • 2.避免频繁的创建销毁对象,可以提高性能
  • 3.避免对共享资源的多重占用
  • 4.可以全局访问

适用场景:

  • 1.需要频繁实例化然后销毁的对象
  • 2.创建对象耗时过多或者耗资源过多,但又经常用到的对象
  • 3.有状态的工具类对象
  • 4.频繁访问数据库或文件的对象
  • 5.以及其他要求只有一个对象的场景
二、饿汉模式

特点:开始即初始化单例对象
优点:不用担心多线程问题
缺点:可能程序没有用到该单例对象,造成浪费

#include <iostream>
using namespace std;
class Singleton {
public:
    static Singleton* GetInstance() {
        return &singleton_;
    }
private:
    Singleton(){}
    static Singleton singleton_;
};

Singleton Singleton::singleton_;
int main() {
    auto p1 = Singleton::GetInstance();
    auto p2 = Singleton::GetInstance();
    bool result = (p1 == p2);
    cout << result << endl;
    return 0;
}
三、懒汉模式

特点:需要时再实例化单例对象
优点:在不使用到单例对象时不会造成资源浪费
“缺点”:需要考虑多线程问题,稍微复杂一点(加锁解决)

#include <iostream>
#include <mutex>
using namespace std;
class Singleton {
public:
	static Singleton* GetInstance() {
		//判断是否已存在实例
		if (p_singleton_ == nullptr) {
			//加锁
			lock_guard<mutex> lock(mux_);
			//可能两个线程同时通过第一次检查,一个线程获得锁,可能另外一个线程已经实例化
			if (p_singleton_ == nullptr) {
				p_singleton_ = new Singleton();
			}
		}
		return p_singleton_;
	}
private:
	Singleton(){}
	static Singleton* p_singleton_;
	static mutex mux_;
};

mutex Singleton::mux_;
Singleton *Singleton::p_singleton_ = nullptr;
int main() {
	auto p1 = Singleton::GetInstance();
	auto p2 = Singleton::GetInstance();
	bool result = (p1 == p2);
	cout << result << endl;
	return 0;
}

参考:设计模式之单例模式-C++
C++对单例模式实现的总结(C++11超简化版!!!必看精髓)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值