设计模式单例模式

Posted zhaocx111222333

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式单例模式相关的知识,希望对你有一定的参考价值。

懒汉模式:

#include<iostream>
#include<mutex>
using namespace std;

class fullsingleClass {
public:

	static int* get()
	{//双重锁模式
		if (_data == nullptr)
		{//先判断是否为空,如果为空则进入,不为空说明已经存在实例,直接返回
			//进入后加锁
			my_mutex.lock();
			if (_data == nullptr)
			{//再判断一次,确保不会因为加锁期间多个线程同时进入
				_data = new int();
			}
			my_mutex.unlock();//解锁
		}
		cout << _data << endl;
		return _data;
	}
private:
	static int* _data;
	static mutex my_mutex;//锁
	fullsingleClass(){}
};
int* fullsingleClass::_data = nullptr;//先定义一个空指针,需要的时候再去给数据
mutex fullsingleClass::my_mutex;//类外初始化


int main()
{
	//fullsingleClass f3;//无法实例化对象
	int* f1 = fullsingleClass::get();
	int* f2 = fullsingleClass::get();

	system("pause");
	return 0;
}

在这里插入图片描述饿汉模式:

#include<iostream>
using namespace std;
//单例模式:构造函数私有化,对外提供一个接口
class hungrysingleClass {
public:
	static int* get()//静态成员函数可以通过类域访问和实例化对象访问
	{
		cout << _data<<endl;
		return _data;

	}

	void Print(){//非静态成员函数必须通过实例化对象访问
		cout << "print" << endl;
	}
private:
	static int* _data;
	hungrysingleClass() {}
};
int* hungrysingleClass::_data = new int();


class A{
private:
	int a;
public:
	void funa(){
		cout << "funa" << endl;
	}
};
int main()
{
	//饿汉模式

	A a1;//正常类可以完成初始化和执行
	a1.funa();

	//hungrysingleClass h1;//构造函数私有化无法创建对象
	//h1.Print();//更别说执行


	int* t1 = hungrysingleClass::get();
	int* t2 = hungrysingleClass::get();
	//int* ehsinglep5 = ehsingleClass::print();//非静态成员函数不可用类域访问

	system("pause");
	return 0;
}

在这里插入图片描述

以上是关于设计模式单例模式的主要内容,如果未能解决你的问题,请参考以下文章

常用代码片段

性能比较好的单例写法

你熟悉的设计模式都有哪些?写出单例模式的实现代码

单例模式以及静态代码块

设计模式之单例模式

设计模式之单例模式