cpp: Singleton Pattern

 

/*****************************************************************//**
 * \file   GoldConfig.h
 * \brief  Singleton Pattern  單例模式 單件模式、Singleton
 * 
 * \author geovindu 塗聚文 Geovin Du
 * \date   20 May 2023
 *********************************************************************/
// GoldConfig.h: 此文件包含 "GoldConfig" 類。裝飾器模式 Singleton Pattern C++ 14
// //Singleton Pattern  單例模式 單件模式、Singleton
// 2023年5月20日 塗聚文 Geovin Du Visual Studio 2022 edit. 

#pragma once
#ifndef GOLDCONFIG_H 
#define GOLDCONFIG_H 

#include <iostream>
#include <list>
#include <map>



using namespace std;

namespace DuLazySingletonPattern
{


	/// <summary>
	/// 懶漢式
	/// Lazy Singleton 
	/// </summary>
	class GoldConfig
	{
	private:
		GoldConfig() {};
		GoldConfig(const GoldConfig& tmpobj);
		GoldConfig& operator = (const GoldConfig& tmpobj);
		~GoldConfig() {};
	public:

		/// <summary>
		/// 
		/// </summary>
		/// <returns></returns>
		static GoldConfig* getInstance()
		{
			//std::lock_guard<std::mutex> gcguard(my_mutex);
			if (m_instance == nullptr)
			{
				//這裏再加鎖
				//std::lock_guard<std::mutex> gcguard(my_mutex);
				//if (m_instance == nullptr)
				//{
				m_instance = new GoldConfig();
				static Garbo garboobj;

				cout << "getInstance: no data." << m_instance << endl;
				//}
			}
			else
			{
				cout << "ok, is data" << endl;
			}
			return m_instance;
		}

	public:
		/// <summary>
		/// 要手工調用才能釋放內存
		/// </summary>
		static void freeInstance()
		{
			if (m_instance != nullptr)
			{
				delete GoldConfig::m_instance;
				GoldConfig::m_instance = nullptr;
				cout << "Sinleton: is data" << m_instance << endl;
			}
		}

	private:
		/// <summary>
		/// 手工釋放單件類對象引入的GameConfig類中的嵌套類(垃圾回收)
		/// </summary>
		class Garbo
		{
		public:
			~Garbo()
			{
				if (GoldConfig::m_instance != nullptr)
				{
					delete GoldConfig::m_instance;
					GoldConfig::m_instance = nullptr;
					cout << "du,getInstance:" << m_instance << endl;
				}
			}
		};

	private:
		static GoldConfig* m_instance; //指向本類對象的指針
	};



}

#endif

/*****************************************************************//**
 * \file   GoldConfig.cpp
 * \brief  Singleton Pattern  單例模式 單件模式、Singleton
 * 
 * \author geovindu 塗聚文 Geovin Du
 * \date  20 May 2023
 *********************************************************************/

// GoldConfig.cpp: 此文件包含 "GoldConfig" 類。裝飾器模式 Singleton Pattern C++ 14
// //Singleton Pattern  單例模式 單件模式、Singleton
// 2023年5月20日 塗聚文 Geovin Du Visual Studio 2022 edit. 

#include "GoldConfig.h"
using namespace std;

namespace DuLazySingletonPattern
{

	GoldConfig* GoldConfig::m_instance = nullptr; //在類外,某個.cpp源文件的開頭位置,爲靜態成員變量賦值(定義並賦值)

}

/*****************************************************************//**
 * \file   GoldCommon.h
 * \brief  Singleton Pattern  單例模式 單件模式、Singleton
 * 
 * \author geovindu 塗聚文 Geovin Du
 * \date   20 May 2023
 *********************************************************************/
// GoldCommon.h: 此文件包含 "GoldCommon" 類。裝飾器模式 Singleton Pattern C++ 14
// //Singleton Pattern  單例模式 單件模式、Singleton
// 2023年5月20日 塗聚文 Geovin Du Visual Studio 2022 edit. 

#pragma once
#ifndef GOLDCOMMON_H 
#define GOLDCOMMON_H 

#include <iostream>
#include <list>
#include <map>
#include <atomic> //#include的頭文件加在源文件頂部位置
#include <mutex>


using namespace std;

namespace DuCommonSingletonPattern
{

	/// <summary>
	/// 常用式
	/// </summary>
	class GoldCommon
	{
	private:
		GoldCommon() {};
		GoldCommon(const GoldCommon& tmpobj);
		GoldCommon& operator = (const GoldCommon& tmpobj);
		~GoldCommon() {};
	public:
		static GoldCommon* getInstance()
		{
			GoldCommon* tmp = m_instance.load(std::memory_order_relaxed);
			std::atomic_thread_fence(std::memory_order_acquire);
			if (tmp == nullptr)
			{
				std::lock_guard<std::mutex> lock(m_mutex);
				tmp = m_instance.load(std::memory_order_relaxed);
				if (tmp == nullptr)
				{
					tmp = new GoldCommon();
					static Garbo garboobj;
					std::atomic_thread_fence(std::memory_order_release);
					m_instance.store(tmp, std::memory_order_relaxed);
				}
			}
			cout << "常用式" << endl;
			return tmp;
		}

	private:
		//手工釋放單件類對象引入的GameConfig類中的嵌套類(垃圾回收)
		class Garbo
		{
		public:
			~Garbo()
			{
				if (GoldCommon::m_instance != nullptr)
				{
					delete GoldCommon::m_instance;
					GoldCommon::m_instance = nullptr;
				}
			}
		};

	private:
		static atomic<GoldCommon*> m_instance;
		static std::mutex m_mutex;


	};
}


#endif


/*****************************************************************//**
 * \file   GoldCommon.cpp
 * \brief  Singleton Pattern  單例模式 單件模式、Singleton
 * 
 * \author geovindu 塗聚文 Geovin Du
 * \date  20 May 2023
 *********************************************************************/
// GoldCommon.cpp: 此文件包含 "GoldCommon" 類。裝飾器模式 Singleton Pattern C++ 14
// //Singleton Pattern  單例模式 單件模式、Singleton
// 2023年5月20日 塗聚文 Geovin Du Visual Studio 2022 edit. 

#include "GoldCommon.h"
#include <atomic> //#include的頭文件加在源文件頂部位置
#include <mutex>


using namespace std;

namespace DuCommonSingletonPattern
{

	std::atomic<GoldCommon*> GoldCommon::m_instance;
	std::mutex GoldCommon::m_mutex;


}


/*****************************************************************//**
 * \file   GoldEager.h
 * \brief  Singleton Pattern  單例模式 單件模式、Singleton
 * 
 * \author geovindu 塗聚文 Geovin Du
 * \date  20 May 2023
 *********************************************************************/
// GoldEager.h: 此文件包含 "GoldEager" 類。裝飾器模式 Singleton Pattern C++ 14
// //Singleton Pattern  單例模式 單件模式、Singleton
// 2023年5月20日 塗聚文 Geovin Du Visual Studio 2022 edit. 

#pragma once
#ifndef GOLDEAGER_H 
#define GOLDEAGER_H 

#include <iostream>
#include <list>
#include <map>
#include <atomic> //#include的頭文件加在源文件頂部位置
#include <mutex>


using namespace std;

namespace DuEagerSingletonPattern
{

	/// <summary>
	/// 餓漢式 Eager Singleton
	/// </summary>
	class GoldEager
	{
		//......
	private:
		GoldEager() {};
		GoldEager(const GoldEager& tmpobj);
		GoldEager& operator = (const GoldEager& tmpobj);
		~GoldEager() {};
	public:
		static GoldEager* getInstance()
		{
			cout << "Eager Singleton" << endl;
			return m_instance;
		}
	private:
		static GoldEager* m_instance;	 //指向本類對象的指針


	private:
		//手工釋放單件類對象引入的GoldEager類中的嵌套類(垃圾回收)
		class Garbo
		{
		public:
			~Garbo()
			{
				if (GoldEager::m_instance != nullptr)
				{
					delete GoldEager::m_instance;
					GoldEager::m_instance = nullptr;
				}
			}
		};

	private:
		static Garbo garboobj;



	};

}

#endif


/*****************************************************************//**
 * \file   GoldEager.cpp
 * \brief  Singleton Pattern  單例模式 單件模式、Singleton
 * 
 * \author geovindu 塗聚文 Geovin Du
 * \date 20  May 2023
 *********************************************************************/
// GoldEager.cpp: 此文件包含 "GoldEager" 類。裝飾器模式 Singleton Pattern C++ 14
// //Singleton Pattern  單例模式 單件模式、Singleton
// 2023年5月20日 塗聚文 Geovin Du Visual Studio 2022 edit. 


#include "GoldEager.h"
#include <atomic> //#include的頭文件加在源文件頂部位置
#include <mutex>


using namespace std;

namespace DuEagerSingletonPattern
{
	GoldEager* GoldEager::m_instance = new GoldEager();//趁靜態成員變量定義的時機直接初始化是被允許的,即便GameConfig構造函數用private修飾
	GoldEager::Garbo GoldEager::garboobj;
}

/*****************************************************************//**
 * \file   GoldFunction.h
 * \brief  Singleton Pattern  單例模式 單件模式、Singleton
 * 
 * \author geovindu 塗聚文 Geovin Du
 * \date  20 May 2023
 *********************************************************************/
// GoldFunction.h: 此文件包含 "GoldFunction" 類。裝飾器模式 Singleton Pattern C++ 14
// //Singleton Pattern  單例模式 單件模式、Singleton
// 2023年5月20日 塗聚文 Geovin Du Visual Studio 2022 edit. 

#pragma once
#ifndef GOLDFUNCTION_H 
#define GOLDFUNCTION_H 

#include <iostream>
#include <list>
#include <map>
#include <atomic> //#include的頭文件加在源文件頂部位置
#include <mutex>


using namespace std;

namespace DuFunctionSingletonPattern
{

	/// <summary>
	/// 
	/// </summary>
	class GoldFunction
	{

	private:
		GoldFunction() {};
		GoldFunction(const GoldFunction& tmpobj);
		GoldFunction& operator = (const GoldFunction& tmpobj);
		~GoldFunction() {};
	public:
		static GoldFunction& getInstance()
		{
			static GoldFunction instance;
			cout << "GoldFunction" << endl;
			return instance;
		}

	public:
		//int myfunc();

	};

}

#endif

/*****************************************************************//**
 * \file   GoldFunction.cpp
 * \brief  Singleton Pattern  單例模式 單件模式、Singleton
 * 2023年5月20日 塗聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu 塗聚文 Geovin Du
 * \date  20 May 2023
 *********************************************************************/
// GoldFunction.cpp: 此文件包含 "GoldFunction" 類。裝飾器模式 Singleton Pattern C++ 14
// //Singleton Pattern  單例模式 單件模式、Singleton
// 2023年5月20日 塗聚文 Geovin Du Visual Studio 2022 edit. 


#include "GoldFunction.h"
using namespace std;

namespace DuFunctionSingletonPattern
{

	/// <summary>
	/// 
	/// </summary>
	/// <returns></returns>
	int myfunc()
	{
		static int stcs = 100; //不需要調用myfunc函數,stcs就已經等於100了
		stcs += 180;
		return stcs;
	}
}


/*****************************************************************//**
 * \file   GeovinDu.h
 * \brief  Singleton Pattern  單例模式 單件模式、Singleton
 * 
 * \author geovindu 塗聚文 Geovin Du
 * \date  20 May 2023
 *********************************************************************/

// GeovinDu.h: 此文件包含 "GeovinDu" 類。裝飾器模式 Singleton Pattern C++ 14
// //Singleton Pattern  單例模式 單件模式、Singleton
// 2023年5月20日 塗聚文 Geovin Du Visual Studio 2022 edit. 

#pragma once
#ifndef GEOVINDU_H 
#define GEOVINDU_H 

#include <iostream>
#include <list>
#include <map>



using namespace std;

namespace DuSingletonPattern
{

	/// <summary>
	/// 
	/// </summary>
	class GeovinDu
	{
	
	private:


	public:
		/// <summary>
		/// 懶漢式
		/// </summary>
		void diplayLazy();

		/// <summary>
		/// 常用式
		/// </summary>
		void displayCommon();
		/// <summary>
		/// 餓漢式
		/// </summary>
		void displayEager();
		/// <summary>
		/// 
		/// </summary>
		void displaFunction();

	};

}

#endif

/*****************************************************************//**
 * \file   GeovinDu.cpp
 * \brief  Singleton Pattern  單例模式 單件模式、Singleton
 * 
 * \author geovindu 塗聚文 Geovin Du
 * \date   20 May 2023
 *********************************************************************/

// GeovinDu.h: 此文件包含 "GeovinDu" 類。裝飾器模式 Singleton Pattern C++ 14
// //Singleton Pattern  單例模式 單件模式、Singleton
// 2023年5月20日 塗聚文 Geovin Du Visual Studio 2022 edit. 




#include "GeovinDu.h"
#include <iostream>
#include <list>
#include <map>

#include "GoldConfig.h";
#include "GoldCommon.h"
#include "GoldEager.h"
#include "GoldFunction.h"

using namespace std;
using namespace DuLazySingletonPattern;
using namespace DuCommonSingletonPattern;
using namespace DuEagerSingletonPattern;
using namespace DuFunctionSingletonPattern;



namespace DuSingletonPattern
{


	/// <summary>
	/// 懶漢式
	/// </summary>
	void GeovinDu::diplayLazy()
	{

		/*DuLazySingletonPattern::GameConfig g_config1;
		DuLazySingletonPattern::GameConfig g_config2;*/

		GoldConfig* g_gc = GoldConfig::getInstance();
		GoldConfig* g_gc2 = GoldConfig::getInstance();
		g_gc->getInstance();
		g_gc2->freeInstance();  //手工釋放內存演示
		

	}
	/// <summary>
	/// 常用式
	/// </summary>
	void GeovinDu::displayCommon()
	{
		DuCommonSingletonPattern::GoldCommon* g_gc_2 = DuCommonSingletonPattern::GoldCommon::getInstance();
		DuCommonSingletonPattern::GoldCommon* g_gc2_2 = DuCommonSingletonPattern::GoldCommon::getInstance();


	}
	/// <summary>
	/// 餓漢式
	/// </summary>
	void GeovinDu::displayEager()
	{
		DuEagerSingletonPattern::GoldEager* g_gc_2 = DuEagerSingletonPattern::GoldEager::getInstance();
		DuEagerSingletonPattern::GoldEager* g_gc2_2 = DuEagerSingletonPattern::GoldEager::getInstance();

	}
	/// <summary>
	/// 
	/// </summary>
	void GeovinDu::displaFunction()
	{

		DuFunctionSingletonPattern::GoldFunction& g_gc40 = DuFunctionSingletonPattern::GoldFunction::getInstance();
		//DuFunctionSingletonPattern::myfunc();
		
	}


}

  

調用:

/*****************************************************************//**
 * \file   ConsoleDuSingletonPattern.cpp
 * \brief  Singleton Pattern  單例模式 單件模式、Singleton
 * 
 * \author geovindu 塗聚文 Geovin Du
 * \date   20 May 2023
 *********************************************************************/

// ConsoleDuSingletonPattern.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。
//  Singleton Pattern 單例模式 單件模式、Singleton C++ 14 
// 2023年4月30日 塗聚文 Geovin Du Visual Studio 2022 edit. 文章來源《C++新經典設計模式》 王健偉編著 清華大學出版社 
#define _UNICODE


#include <iostream>

#include "GeovinDu.h"

using namespace std;
using namespace DuSingletonPattern;


int main()
{

    std::cout << "Hello World! 塗聚文 Geovin Du\n";
    GeovinDu geovin;
    geovin.diplayLazy();
    geovin.displayCommon();
    geovin.displayEager();
    geovin.displaFunction();

    system("pause");

    return 0;


}

// 運行程序: Ctrl + F5 或調試 >“開始執行(不調試)”菜單
// 調試程序: F5 或調試 >“開始調試”菜單

// 入門使用技巧: 
//   1. 使用解決方案資源管理器窗口添加/管理文件
//   2. 使用團隊資源管理器窗口連接到源代碼管理
//   3. 使用輸出窗口查看生成輸出和其他消息
//   4. 使用錯誤列表窗口查看錯誤
//   5. 轉到“項目”>“添加新項”以創建新的代碼文件,或轉到“項目”>“添加現有項”以將現有代碼文件添加到項目
//   6. 將來,若要再次打開此項目,請轉到“文件”>“打開”>“項目”並選擇 .sln 文件
#define UNICODE

  

 

 

輸出:

Hello World! 塗聚文 Geovin Du
getInstance: no data.000001550C81A8A0
ok, is data
ok, is data
Sinleton: is data0000000000000000
常用式
常用式
Eager Singleton
Eager Singleton
GoldFunction
請按任意鍵繼續. . .

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章