C++实现单例模式

C++实现单例模式

  • 单例模式的定义:
  • 第一种实现方式:饿汉模式
    • 1.适用场景
    • 2.优缺点
    • 3.是否线程安全
    • 4.c++代码实现
  • 第二种实现方式:懒汉模式
    • 1.适用场景
    • 2.优缺点
    • 3.是否是线程安全的
    • 4.代码实现
    • 5.懒汉模式在Linux环境下的实现

单例模式的定义:

一种创建类型的设计模式,通过单例模式的方法创建的类只能有一个实例,也就是说一个类只能创建一个对象。
根据实现方式的不同,又可以分为饿汉模式和懒汉模式

第一种实现方式:饿汉模式

程序启动时立即创建实例

1.适用场景

多线程高并发环境频繁使用,性能要求比较高,需要在程序启动时就加载好资源

2.优缺点

优点是简单;
缺点是可能会导致进程启动慢,而且有多个单例类对象启动顺序不定。

3.是否线程安全

饿汉模式在类定义时就创建了一个静态的对象供外界适用,并且不再改变,所以是线程安全的。

4.c++代码实现

实现步骤:
1.为了只能创建一个对象,所以构造函数私有化,并且向外需要提供一个静态的获取实例的接口,让外部不需要通过对象访问类中的成员函数,直接通过类名来获取实例化对象。
2.将实例对象设置为静态,保证这个对象在程序运行期间都可以使用,静态对象可以在主函数之前就完成初始化;
3.获取实例对象接口的返回值设置为指针/引用类型,这样可以保证不会发生传值拷贝。
4.防拷贝,将拷贝构造函数和赋值运算符函数声明为delete;

//饿汉模式,程序启动就创建对象
class SingleTon{
   
public:
	//公有的方法获取对象
	//返回值类型为指针或者引用,这样只会有一份数据,只创建一个对象
	static SingleTon* getInstance()
	{
   
		//获取已存在对象的地址
		return &_instance;
	}
private:
	SingleTon(){
   }
	//防拷贝
	SingleTon(const SingleTon& obj) = delete;
	SingleTon& operator= (const SingleTon& obj)=delete;

	//定义一个静态成员,静态成员存放在数据段
	static SingleTon _instance;
};

//在程序入口之前完成对单例对象的初始化,静态的对象就有这种特性
//类的成员之间可以相互访问
//因此静态对象可以调用构造函数
SingleTon SingleTon::_instance;

第二种实现方式:懒汉模式

程序需要使用实例时才会去创建实例(延时加载)

1.适用场景

程序不需要启动时就加载所有的资源,在需要的时候才去加载资源。

2.优缺点

优点:
第一次使用实例对象时创建对象;
启动快;
多个单例类对象启动顺序可以自由控制;
缺点:复杂

3.是否是线程安全的

因为程序在第一次需要使用实例时才会去创建实例,而创建实例的过程不是线程安全的,所以需要加锁保护

4.代码实现

构造函数私有,提供公有的外部接口返回实例;
第一次创建实例时加锁,double-check;
防拷贝;

 
 

你可能感兴趣的:(C++,设计模式,c++,设计模式)