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

结果:

相关推荐
宵时待雨12 分钟前
优选算法专题6:模拟
数据结构·c++·算法·leetcode·职场和发展
H Journey20 分钟前
C++性能优化
c++·性能优化
叼烟扛炮21 分钟前
C++ 知识点19 匿名对象
开发语言·c++·算法·匿名对象
叼烟扛炮26 分钟前
C++ 知识点23 类模板
开发语言·c++·算法·类模版
邪修king27 分钟前
C++ 继承超全详解:核心语法、作用域、默认函数、菱形继承与避坑指南
c语言·c++
L_090729 分钟前
【C++】STL— 封装红黑树以实现map 和 set
数据结构·c++
麦兜和小可的舅舅32 分钟前
ClickHouse Dist表的Replica选择逻辑深度解析-- Custom Key以及Sample的执行逻辑
c++·clickhouse·distribute·shard
djarmy1 小时前
C 标准库 `<stdio.h>` 完整函数清单(官方标准 + 常用全部函数)
c语言·c++·算法
code_whiter1 小时前
C++10(list)
c++·windows·list
2301_815279521 小时前
实战分享实现 C++ 管理类单例模式:特点与最佳实践
javascript·c++·单例模式