学习笔记C++_6 设计模式

本文详细介绍了单例模式的三种常见实现(懒汉式、饿汉式和工厂式),比较了它们的优缺点,重点讲解了懒汉式和饿汉式的区别以及工厂设计模式如何解耦对象创建。
摘要由CSDN通过智能技术生成

一、单例模式

1.1 懒汉式

单例模式:
1、当前类最多只能创建一个实例
2、当前这个唯一的实例由自己去创建
3、向整个系统提供全局的公共的接口

懒汉式:当第一次获取实例时,现去创建,时间换空间

#include<iostream>

using namespace std;

class CSingleton {
private:
	CSingleton():m_a(0) /*:m_psin(nullptr)*/ {}
	CSingleton(const CSingleton&) = delete;	//删除类中的拷贝构造函数
	~CSingleton(){}

	static CSingleton* m_psin;

	static class DelSingleton {
	public:
		~DelSingleton() {
			CSingleton::DeleteSingleton();
		}
	}m_delsin;

public:
	//在多线程下可能会创建出多个对象
	static CSingleton* GetSingleton() {
		//加锁
		if (!m_psin)
			m_psin = new CSingleton;
		//解锁
		return m_psin;
	}

	static void DeleteSingleton() {
		if (m_psin)
			delete m_psin;
		m_psin = nullptr;
	}
public:
	int m_a;
};

CSingleton* CSingleton::m_psin = nullptr;
CSingleton::DelSingleton CSingleton::m_delsin;

int main() {
	CSingleton* psin1 = CSingleton::GetSingleton();
	CSingleton* psin2 = CSingleton::GetSingleton();
	cout << psin1 << ' ' << psin2 << endl;	//不同指针,但是同一个对象

	psin1->m_a = 1;
	psin2->m_a = 2;
	cout << psin1->m_a << endl;	//2

	CSingleton::DeleteSingleton();	//回收单例

	psin1 = CSingleton::GetSingleton();
	cout << psin1->m_a << endl;	//0
	//CSingleton sin(*psin1);
}

静态局部特点:当第一次调用这个接口函数,创建出对象后,开始存在,再次调用接口函数不会创建新的对象,而是使用已存在的这个静态局部对象

#include<iostream>

using namespace std;

class CSingleton {
private:
	CSingleton():m_a(0) {}
	CSingleton(const CSingleton&) = delete;	
	~CSingleton(){}

public:
	static CSingleton* GetSingleton() {
		static CSingleton sin;	//静态局部
		return &sin;
	}

public:
	int m_a;
};

int main() {
	CSingleton* psin1 = CSingleton::GetSingleton();
	CSingleton* psin2 = CSingleton::GetSingleton();
	cout << psin1 << ' ' << psin2 << endl;

	psin2->m_a = 2;
	cout << psin1->m_a << endl;	//2

}

1.2 饿汉式

/*
	饿汉式:提前创建好单例,在调用接口时,只是获取这个唯一的实例。空间换时间

*/
#include<iostream>

using namespace std;

class CSingleton {
private:
	CSingleton() :m_a(0) {}
	CSingleton(const CSingleton&) = delete;
	~CSingleton() {}
	static CSingleton sin;
public:
	static CSingleton* GetSingleton() {
		return &sin;
	}

public:
	int m_a;
};

CSingleton CSingleton::sin;

int main() {
	CSingleton* psin1 = CSingleton::GetSingleton();
	CSingleton* psin2 = CSingleton::GetSingleton();
	cout << psin1 << ' ' << psin2 << endl;

	psin2->m_a = 2;
	cout << psin1->m_a << endl;	//2

}

优点:

1、单例模式提供了严格的对唯一实例的创建、访问和销毁,安全性高。(ps:任务处理器)

2、单例模式的的实现可以节省系统资源

1.3 工厂式

主要是用来集中创建对象的,如果在任何使用的地方创建对象那就造成了类或方法之间的耦合。如果要更换对象,就要在所有使用的地方都要修改一遍。优势:解耦。

1.3.1 简单工厂

#include <iostream>

using namespace std;

class CEngine {
public:
	virtual void working() = 0;
};

class CEngine2T :public CEngine {
public:
	void working() {
		cout << "2T" << endl;
	}
};

class CEngine2L :public CEngine {
public:
	void working() {
		cout << "2L" << endl;
	}
};

//简单工厂
class CFactoryEngine {
public:
	CEngine* CreateEngine(string type) {
		if (type == "T")
			return new CEngine2T;
		else if (type == "L")
			return new CEngine2L;
		else return nullptr;
	}
};

class Ccar {
public:
	CEngine* m_pEngine;	//父类指针

	Ccar():m_pEngine(new CEngine2L){}

	Ccar(string type) {
		if (type == "T")
			m_pEngine = new CEngine2T;
		else if (type == "L")
			m_pEngine = new CEngine2L;
		else m_pEngine = nullptr;
	}

	~Ccar() {
		if (m_pEngine) {
			delete m_pEngine;
			m_pEngine = nullptr;
		}
	}

	Ccar(CFactoryEngine* pFac, string type):m_pEngine(pFac?pFac->CreateEngine(type):nullptr) {}

	void run() {
		m_pEngine->working();
		cout << "running" << endl;
	}
};

int main() {
	Ccar car1;
	car1.run();
	Ccar car2("T");
	car2.run();

	CFactoryEngine Fac;
	Ccar car3(&Fac, "L");
	car3.run();
}

1.3.2 工厂方法

#include <iostream>

using namespace std;

class CEngine {
public:
	virtual void working() = 0;
};

class CEngine2T :public CEngine {
public:
	void working() {
		cout << "2T" << endl;
	}
};

class CEngine2L :public CEngine {
public:
	void working() {
		cout << "2L" << endl;
	}
};

//简单工厂
class CFactoryEngine {
public:
	virtual CEngine* CreateEngine() = 0;
};

//工厂方法
class CFacEngine2T :public CFactoryEngine {
public:
	CEngine* CreateEngine() {
		return new CEngine2T;
	}
};

class CFacEngine2L :public CFactoryEngine {
public:
	CEngine* CreateEngine() {
		return new CEngine2L;
	}
};

class Ccar {
public:
	CEngine* m_pEngine;	//父类指针

	Ccar() :m_pEngine(new CEngine2L) {}

	Ccar(string type) {
		if (type == "T")
			m_pEngine = new CEngine2T;
		else if (type == "L")
			m_pEngine = new CEngine2L;
		else m_pEngine = nullptr;
	}

	~Ccar() {
		if (m_pEngine) {
			delete m_pEngine;
			m_pEngine = nullptr;
		}
	}

	Ccar(CFactoryEngine* pFac) :m_pEngine(pFac ? pFac->CreateEngine() : nullptr) {}

	void run() {
		m_pEngine->working();
		cout << "running" << endl;
	}
};

int main() {
	CFactoryEngine* pFac1 = new CFacEngine2L;
	CFactoryEngine* pFac2 = new CFacEngine2T;
	Ccar car(pFac2);
	car.run();

	delete pFac1;
	delete pFac2;
}

1.3.3 抽象工厂

#include <iostream>

using namespace std;

//具体产品
class CEngine {
public:
	virtual void working() = 0;
};

class CEngine2T :public CEngine {
public:
	void working() {
		cout << "2T" << endl;
	}
};

class CEngine2L :public CEngine {
public:
	void working() {
		cout << "2L" << endl;
	}
};

class CGearbox {
public:
	virtual void working() = 0;
};

class CGearboxAuto :public CGearbox {
public:
	virtual void working() {
		cout << "自动挡变速箱正在工作" << endl;
	}
};

class CGearboxManual :public CGearbox {
public:
	virtual void working() {
		cout << "手动挡变速箱正在工作" << endl;
	}
};

class CFactory {
public:
	virtual CEngine* CreateEngine() = 0;
	virtual CGearbox* CreateGearbox() = 0;
};

class CFac2TAuto :public CFactory {
	virtual CEngine* CreateEngine() {
		return new CEngine2T;
	}
	virtual CGearbox* CreateGearbox() {
		return new CGearboxAuto;
	}
};

class Ccar {
public:
	CEngine* m_pEngine;	//父类指针
	CGearbox* m_pCGear;

	Ccar(CFactory* pFac) :m_pEngine(pFac ? pFac->CreateEngine() : nullptr), m_pCGear(pFac ? pFac->CreateGearbox() : nullptr) {};

	~Ccar() {
		if (m_pCGear) {
			delete m_pCGear;
			m_pCGear = nullptr;
		}
		if (m_pEngine) {
			delete m_pEngine;
			m_pEngine = nullptr;
		}
	}

	void run() {
		m_pCGear->working();
		m_pEngine->working();
		cout << "running" << endl;
	}
};

int main() {
	CFactory* pFac = new CFac2TAuto;
	Ccar car(pFac);
	car.run();

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值