一、单例模式
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();
}