c++单例模式:饿汉式、懒汉式、线程安全懒汉式、静态对象式

设计模式分类及原则

1、设计模式分类

总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

2、设计模式的六大设计原则

单一职责原则:类的设计尽量做到只有一个原因可以引起它的改变
里氏替换原则:只要父类出现的地方子类就可以出现,且替换成子类也不会出现任何错误或者异常
依赖倒置原则:针对接口编程,而不是针对实现编程
接口隔离原则:不要建立臃肿庞大的接口。即接口尽量细化,同时接口中的方法尽量少
迪米特法则: 一个对象应该对其他对象有最少的了解,也就是说一个类要对自己需要耦合或者调用的类知道的最少
开闭原则: 一个软件实体,比如类,模块,函数应该对扩展开放,对修改关闭

五种单例模式记录

1、懒汉式

 class Singleton
 5 {
 6 public:
 7     static Singleton *GetInstance()
 8     {
 9         if (m_Instance == NULL )
10         {
11             m_Instance = new Singleton ();
12         }
13         return m_Instance;
14     }
31 private:
32     Singleton(){}
33     static Singleton *m_Instance;
35 };
 Singleton *Singleton ::m_Instance = NULL;

缺点较为明显:线程不安全

2、线程安全的懒汉式

class Singleton
 5 {
 6 public:
 7     static Singleton *GetInstance()
 8     {
 9         if (m_Instance == NULL )//线程123符合条件往下执行
10         {
11             Lock();//线程1拿到锁往下执行
12             if (m_Instance == NULL )//如果不加这个判断,线程1执行完线程2继续new会造成再次实例化
13             {
14                 m_Instance = new Singleton ();
15             }
16             UnLock(); 
17         }
18         return m_Instance;
19     }
35 private:
36     Singleton(){}
37     static Singleton *m_Instance;
39 };
41 Singleton *Singleton ::m_Instance = NULL;

3、依据模板及C++新特性的单例(也属于懒汉式且线程安全)

template <typename T>
class Singleton
{
public:
	virtual ~Singleton() = default;

	static T& GetInstance()
	{
		std::call_once(m_onceFlag, []() {
			m_instance.reset(new T);
		});
		return *m_instance.get();
	}
private:
	Singleton() = default;
	Singleton(const Singleton&) = delete;
	Singleton& operator==(const Singleton&) = delete;

	static std::once_flag m_onceFlag;
	static std::unique_ptr<T> m_instance;
};
template <typename T>
std::unique_ptr<T> Singleton<T>::m_instance;
template <typename T>
std::once_flag Singleton<T>::m_onceFlag;

4、饿汉式

class Singleton
 5 {
 6 public:
 7     static Singleton *GetInstance()
 8     {
 9         return const_cast <Singleton *>(m_Instance);
10     }
21  
26 private:
27     Singleton(){}
28     static const Singleton *m_Instance;
30 };
32 const Singleton *Singleton ::m_Instance = new Singleton();

以上三种都需要使用者进行手动调用销毁函数来释放空间,第四种的对象模式则无需手动调用

5、静态对象的懒汉式

class Singleton
 5 {
 6 public:
 7     static Singleton *GetInstance()
 8     {
 9         static Singleton m_Instance;
10         return &m_Instance;
11     }
18 private:
19     Singleton(){};
21 };

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值