单例模式(懒汉式和饿汉式)

#include
#include

//懒汉式 以时间换空间,线程不安全
class SingleClass1
{
private:
	SingleClass1();
	~SingleClass1();
	static SingleClass1* ptr;
	static std::mutex mux;
public:
	static SingleClass1* GetInstance();
	class delelClass {
	public:
		delelClass() {
			std::cout << "delelClass Construct" << std::endl;
		}
		~delelClass() {
			if (SingleClass1::ptr) {
				delete SingleClass1::ptr;
				SingleClass1::ptr = nullptr;
			}
			std::cout << "~delelClass" << std::endl;
		}
	};

	static delelClass deleC;
};

SingleClass1::SingleClass1()
{
	std::cout << "SingleClass1 Construct" << std::endl;
}

SingleClass1::~SingleClass1()
{
	std::cout << "~SingleClass1" << std::endl;
}

SingleClass1* SingleClass1::ptr = nullptr;
std::mutex SingleClass1::mux;
SingleClass1::delelClass SingleClass1::deleC;

SingleClass1* SingleClass1::GetInstance() {
	if (ptr == nullptr) {
		std::unique_lock<std::mutex> locks(mux);
		if (ptr == nullptr) {
			ptr = new SingleClass1();
		}
		return ptr;
	}
}


//饿汉式,以空间换时间,线程安全
class SingleClass2
{
private:
	SingleClass2();
	~SingleClass2();
	static SingleClass2* ptr;
public:
	static SingleClass2* GetInstance();
	class delelClass {
	public:
		delelClass() {
			std::cout << "delelClass Construct" << std::endl;
		}
		~delelClass() {
			if (SingleClass2::ptr) {
				delete SingleClass2::ptr;
				SingleClass2::ptr = nullptr;
			}
			std::cout << "~delelClass" << std::endl;
		}
	};

	static delelClass deleC;
};

SingleClass2::SingleClass2()
{
	std::cout << "SingleClass2 Construct" << std::endl;
}

SingleClass2::~SingleClass2()
{
	std::cout << "~SingleClass2" << std::endl;
}

SingleClass2* SingleClass2::ptr = new SingleClass2();
SingleClass2::delelClass SingleClass2::deleC;

SingleClass2* SingleClass2::GetInstance() {
	return ptr;
}

int main() {
	std::cout << "main start" << std::endl;
	SingleClass1* p1 = SingleClass1::GetInstance();
	SingleClass1* p2 = SingleClass1::GetInstance();

	SingleClass2* t1 = SingleClass2::GetInstance();
	SingleClass2* t2 = SingleClass2::GetInstance();
	std::cout << "main end" << std::endl;
	return 0;
}

你可能感兴趣的:(单例模式,c++)