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;
}

结果:

相关推荐
水饺编程1 小时前
第5章,[标签 Win32] :获取设备环境的信息
c语言·c++·windows·visual studio
lhbian1 小时前
C++、C与易语言:编程语言对比解析
c语言·开发语言·c++
hehelm1 小时前
二叉搜索树
c++
云泽8082 小时前
笔试算法 - 双指针篇(一):移动零、复写零、快乐数与盛水容器
c++·算法
小堃学编程2 小时前
【项目实战】基于protobuf的发布订阅式消息队列(4)—— 服务端
c语言·c++·vscode·消息队列·gtest·protobuf·muduo
小白学大数据2 小时前
解决 Python 爬虫被限制:延迟抓取指令深度解析
开发语言·c++·爬虫·python
会编程的土豆2 小时前
【复习】二分查找
数据结构·c++·算法
yuanpan3 小时前
Python 调用 DLL 动态库入门:Windows 下调用 C++ 与 C# 动态库完整示例
c++·windows·python
handler014 小时前
Linux: 基本指令知识点(3)
linux·服务器·c语言·开发语言·c++·笔记
wuminyu4 小时前
专家视角看Java线程生命周期与上下文切换的本质
java·linux·c语言·jvm·c++