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

单例模式

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

cpp 复制代码
// 实现一个单例
#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四个方法,在工厂类中添加新英雄,就可以提供给用户使用了。

cpp 复制代码
// 实现一个工厂模式
#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;
}

结果:

相关推荐
ll7788114 小时前
C++学习之路,从0到精通的征途:继承
开发语言·数据结构·c++·学习·算法
我不想当小卡拉米4 小时前
【Linux】操作系统入门:冯诺依曼体系结构
linux·开发语言·网络·c++
炎芯随笔5 小时前
【C++】【设计模式】生产者-消费者模型
开发语言·c++·设计模式
乌鸦9445 小时前
《类和对象(下)》
开发语言·c++·类和对象+
逐光沧海5 小时前
数据结构基础--蓝桥杯备考
数据结构·c++·算法·蓝桥杯
前进的程序员6 小时前
嵌入式开发中 C++ 跨平台开发经验与解决方案
开发语言·c++
菜一头包6 小时前
c++ std库中的文件操作学习笔记
c++·笔记·学习
吃个早饭8 小时前
2025年第十六届蓝桥杯大赛软件赛C/C++大学B组题解
c语言·c++·蓝桥杯
阿沁QWQ9 小时前
单例模式的两种设计
开发语言·c++·单例模式
六bring个六9 小时前
qtcreater配置opencv
c++·qt·opencv·计算机视觉·图形渲染·opengl