单例模式
单例模式即一个类只创建一个实例,提供一个全局访问点。单例模式主要是为了控制资源访问,在一些功能如:数据库连接池,日志类实例,线程池等都可以采用单例模式。
// 实现一个单例
#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;
}
结果: