0
点赞
收藏
分享

微信扫一扫

单例模式 C++(两种方式)、Python3


文章目录

  • ​​1、C++​​
  • ​​1.1、饿汉模式​​
  • ​​1.2、懒汉模式​​
  • ​​2、Python​​
  • ​​2.1、效果图​​
  • ​​2.2、源码​​

1、C++

1.1、饿汉模式

就是说不管你将来用不用,程序启动时就创建一个唯一的实例对象

  • 优点:简单,明了,容易理解,代码简洁。
  • 缺点:可能会导致进程启动慢,且如果有多个单例类对象实例启动顺序不确定。

class Singleton
{
public:
static Singleton* GetInstance()
{
return &m_instance;
}

private:
// 构造函数私有
Singleton(){};

// C++98 防拷贝
Singleton(Singleton const&);
Singleton& operator=(Singleton const&);

// or

// C++11
Singleton(Singleton const&) = delete;
Singleton& operator=(Singleton const&) = delete;

static Singleton m_instance;
};

Singleton Singleton::m_instance; // 在程序入口之前就完成单例对象的初始化

注:如果这个单例对象在多线程高并发环境下频繁使用,性能要求较高,那么显然使用饿汉模式来避免资源竞争,提高响应速度更好。

1.2、懒汉模式

如果单例对象构造十分耗时或者占用很多资源,比如加载插件啊, 初始化网络连接啊,读取文件啊等等,而有可能该对象程序运行时不会用到,那么也要在程序一开始就进行初始化,就会导致程序启动时非常的缓慢。 所以这种情况使用懒汉模式(延迟加载)更好

  • 优点:第一次使用实例对象时,创建对象。进程启动无负载。多个单例实例启动顺序自由控制。
  • 缺点:复杂,难以理解,代码繁琐

#include <iostream>
#include <mutex>
#include <thread>
using namespace std;
class Singleton
{
public:
static Singleton* GetInstance() {
// 注意这里一定要使用Double-Check的方式加锁,才能保证效率和线程安全
if (nullptr == m_pInstance) {
m_mtx.lock();
if (nullptr == m_pInstance) {
m_pInstance = new Singleton();
}
m_mtx.unlock();
}
return m_pInstance;
}
// 实现一个内嵌垃圾回收类
class CGarbo {
public:
~CGarbo(){
if (Singleton::m_pInstance)
delete Singleton::m_pInstance;
}
};
// 定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数从而释放单例对象
static CGarbo Garbo;
private:
// 构造函数私有
Singleton(){};
// 防拷贝
Singleton(Singleton const&);
Singleton& operator=(Singleton const&);
static Singleton* m_pInstance; // 单例对象指针
static mutex m_mtx; //互斥锁
};
Singleton* Singleton::m_pInstance = nullptr;
Singleton::CGarbo Garbo;
mutex Singleton::m_mtx;
void func(int n)
{
cout << Singleton::GetInstance() << endl;
}
// 多线程环境下演示上面GetInstance()加锁和不加锁的区别。
int main()
{
thread t1(func, 10);
thread t2(func, 10);
t1.join();
t2.join();
cout << Singleton::GetInstance() << endl;
cout << Singleton::GetInstance() << endl;
}

2、Python

2.1、效果图

单例模式 C++(两种方式)、Python3_单例

2.2、源码

class Singleton(object):
__instance = None # 定义一个类属性做判断

def __new__(cls):

if cls.__instance == None:
# 如果__instance为空证明是第一次创建实例
# 通过父类的__new__(cls)创建实例
cls.__instance = object.__new__(cls)
return cls.__instance
else:
# 返回上一个对象的引用
return cls.__instance

a = Singleton()
print(id(a))
b = Singleton()
print(id(b))

print("沙师弟,人生苦短,用Python吧")


举报

相关推荐

0 条评论