1. 程式人生 > >Singleton單例模式C++

Singleton單例模式C++

單例模式好幾種

此處參考如下兩人學習https://blog.csdn.net/cjbct/article/details/79266057

                                       https://blog.csdn.net/liang19890820/article/details/61615495

程式碼部分參考如上,實現過程如下,基礎知識內容有所借鑑

單例類只能有一個例項

只允許自己建立自己

提供這個例項給其他所有物件

容易出錯位置;執行緒安全、建立時記憶體問題、拷貝建構函式的處理

所以產生處理如下幾種不錯的解決方案

/**********************************************************************************************************************/

可以生成無數個指向同一地址的指標。 只能拷貝物件的地址

#pragma once
//singlentonehan.h
#ifndef SINGLENTONEHAN_H
#define SINGLENTONEHAN_H
/*
餓漢式
即類產生的時候就建立好例項物件,這是一種空間換時間的方式
執行緒安全
*/
#include <iostream>

using namespace std;

class Singlentonehan
{
public:
	static Singlentonehan* GetInstanceehan();
	
private:
	Singlentonehan();
	~Singlentonehan();
	Singlentonehan(const Singlentonehan&);
	Singlentonehan& operator=(const Singlentonehan&);
	
};

Singlentonehan* Singlentonehan::GetInstanceehan()
{
	static Singlentonehan instanceehan;//區域性靜態變數
	return &instanceehan;
}

Singlentonehan::Singlentonehan()
{
	cout << "建立Singlentonehan" << endl;
}

Singlentonehan::~Singlentonehan()
{
	cout << "析構Singlentonehan" << endl;
}


#endif // !SINGLENTONLANHAN_H


#include <iostream>
#include "singletonehan.h"

using namespace std;

int main()
{
	Singlentonehan *s1 = Singlentonehan::GetInstanceehan();
	Singlentonehan *s2 = Singlentonehan::GetInstanceehan();
	cout << s1<< endl;
	cout << s2<< endl;
	system("pause");
	return 0;
}

/*******************************************************************************************************************************/

採用是引用,使用時注意不能拷貝

#pragma once
//singlentonehan.h
#ifndef SINGLENTONEHAN_H
#define SINGLENTONEHAN_H
/*
餓漢式
即類產生的時候就建立好例項物件,這是一種空間換時間的方式
執行緒安全
*/
#include <iostream>

using namespace std;

class Singlentonehan
{
public:
	static Singlentonehan& GetInstanceehan();
	
private:
	Singlentonehan();
	~Singlentonehan();
	Singlentonehan(const Singlentonehan&);
	Singlentonehan& operator=(const Singlentonehan&);
	
};

Singlentonehan& Singlentonehan::GetInstanceehan()
{
	static Singlentonehan instanceehan;//區域性靜態變數
	return instanceehan;
}

Singlentonehan::Singlentonehan()
{
	cout << "建立Singlentonehan" << endl;
}

Singlentonehan::~Singlentonehan()
{
	cout << "析構Singlentonehan" << endl;
}


#endif // !SINGLENTONLANHAN_H


#include <iostream>
#include "singletonehan.h"

using namespace std;

int main()
{
	Singlentonehan::GetInstanceehan();
	Singlentonehan::GetInstanceehan();

	system("pause");
	return 0;
}

/*******************************************************************************************************************************/

多執行緒和靜態成員方法還未嘗試