/*****************************************************************//** * \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 請按任意鍵繼續. . .