欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > C++实现单例模式/工厂模式

C++实现单例模式/工厂模式

2024/10/24 15:16:34 来源:https://blog.csdn.net/qq_52313711/article/details/141023869  浏览:    关键词:C++实现单例模式/工厂模式

单例模式

单例模式即一个类只创建一个实例,提供一个全局访问点。单例模式主要是为了控制资源访问,在一些功能如:数据库连接池,日志类实例,线程池等都可以采用单例模式。

// 实现一个单例
#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;
}

结果:
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com