首页 > 其他分享 >cpp: Singleton Pattern

cpp: Singleton Pattern

时间:2023-05-20 09:55:22浏览次数:79  
标签:std Singleton Pattern GoldConfig namespace GoldEager cpp include

 

// 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

// 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源文件的开头位置,为静态成员变量赋值(定义并赋值)

}

// 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


// 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;


}


// 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

// 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;
}

// 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

// 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;
	}
}



// 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

// 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();
		
	}


}

  

调用:

// 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
请按任意键继续. . .

  

标签:std,Singleton,Pattern,GoldConfig,namespace,GoldEager,cpp,include
From: https://www.cnblogs.com/geovindu/p/17416814.html

相关文章

  • pta_【CPP0039】vector应用测试
    #include<iostream>#include<vector>#include<algorithm>usingnamespacestd;intmain(void){inti,a[10],b;for(i=0;i<10;i++){scanf("%d",&a[i]);}scanf("%d",&b);//插入的数{vector<int&......
  • 模板模式(Template Pattern)
    模板模式一、介绍  模板模式(TemplatePattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方式使......
  • 组合模式(Composite Pattern)
    组合模式一、概述  组合模式(CompositePattern):组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。二、介绍......
  • 策略模式(Strategy Pattern)
    策略模式一、介绍  在策略模式(StrategyPattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。意图:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。主要解决:在有多种算法相似的情况下,使用if...else所带来的复杂和难以维护......
  • Autofac register an instance for a interface for singleton
     一个consoleapp调用CorevarloggerFactory=LoggerFactory.Create(builder=>{builder.AddConsole();builder.AddSerilog();});builder.RegisterInstance(loggerFactory).As&l......
  • CPP0037利用类模板解决绝对值功能
    请使用模板参数设计实现绝对值模板类Absolute,Absolute类功能要求成员函数getValue(void)const计算类数据的绝对值,类数据类型应能适应整型、浮点型、双精度型等各种类型,绝对值类型与类数据一样。#include<iostream>usingnamespacestd;/*请在这里填写答案*/template<classT>c......
  • cpp: point
     //ConsoleStructSimpleApp.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。//#include<iostream>#include<fstream>//文件操作#include<sstream>//int转string#include<iomanip>//cout格式化输出setw()#include<stdlib.h>#include&qu......
  • pta_【CPP0029】以圆类Circle及立体图形类Solid为基础设计圆锥类Cone
    #include<iostream>#include<cmath>usingnamespacestd;//点类PointclassPoint{private:doublex;doubley;public:Point(doublexv=0,doubleyv=0);/*构造函数*/Point(constPoint&p);/*拷贝构造*/~Point();/*......
  • cpp: Observer Pattern II
     //SupperGold.h:此文件包含"SupperGold"类。ObserverPattern观察者模式C++14//JewelryObserverPattern观察者模式//2023年5月10日涂聚文GeovinDuVisualStudio2022edit.#pragmaonce#ifndefSUPPERGOLD_H#defineSUPPERGOLD_H#include<io......
  • 适配器模式(Adapter Pattern)
    模式动机适配器模式(AdapterPattern)是一种使用频率非常高的结构型模式,如果在系统中存在不兼容的接口,可以通过引入一个适配器来使得原本因为接口不兼容而不能一起工作的两个类可以协同工作。适配器模式中适配器的作用与现实生活中存在的电源适配器、网络适配器等作用相同。在引入......