单例模式
单例模式即一个类只创建一个实例,提供一个全局访问点。单例模式主要是为了控制资源访问,在一些功能如:数据库连接池,日志类实例,线程池等都可以采用单例模式。
// 实现一个单例
#include<iostream>
#include<mutex>
#include<memory>
using namespace std;
class Singleton{
private:
Singleton(){
cout<<"Singleton instance create"<<endl;
}
static mutex mtx;
static unique_ptr<Singleton> _instance;
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
public:
static Singleton* getInstance() {
if (_instance == nullptr) {
lock_guard<mutex> lock(mtx);
if (_instance == nullptr) {
_instance.reset(new Singleton);
}
}
return _instance.get();
}
};
mutex Singleton::mtx;
unique_ptr<Singleton> Singleton::_instance = nullptr;
int main() {
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
cout<<"s1:"<<s1<<endl;
cout<<"s2:"<<s2<<endl;
return 0;
}
运行结果:
工厂模式
工厂模式在即使用一个管理类统一地创建一群被管理类,这些被管理类应该有继承的关系。工厂模式主要的作用为解耦对象的创建和使用。打个比方,英雄联盟里每个英雄都有QWER4个技能,那么可以采用工厂模式管理所有的英雄,当要创建新英雄时,只需要在产品类的子类中添加新英雄并实现QWER四个方法,在工厂类中添加新英雄,就可以提供给用户使用了。
// 实现一个工厂模式
#include<iostream>
using namespace std;
class ProductBase{
public:
virtual void use() = 0;
virtual ~ProductBase(){}
};
class Product1 : public ProductBase{
public:
void use() override {
cout<<"product1 use"<<endl;
}
};
class Product2 : public ProductBase{
public:
void use() override {
cout<<"product2 use"<<endl;
}
};
class Factory{
public:
ProductBase* createProduct(int type) {
switch (type) {
case 1:
return new Product1();
break;
case 2:
return new Product2();
break;
default:
cout<<"没这个产品"<<endl;
break;
}
return nullptr;
}
};
int main() {
Factory fa;
ProductBase* p1 = fa.createProduct(1);
p1->use();
delete p1;
ProductBase* p2 = fa.createProduct(2);
p2->use();
delete p2;
return 0;
}
结果: