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

结果:

相关推荐
旖-旎5 小时前
《LeetCode647 回文子串 || LeetCode 5 最长回文子串》
c++·算法·leetcode·动态规划·哈希算法
Darkwanderor6 小时前
对Linux的进程控制的研究
linux·运维·c++
云泽8086 小时前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范
REDcker6 小时前
libdatachannel 快速入门
c++·webrtc·datachannel
second608 小时前
第一部分:快速上手 —— 建立 C++ 基本语法与编程范式
开发语言·c++
郝学胜-神的一滴8 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法
bksczm8 小时前
linux之线程概念和控制
linux·开发语言·c++
hehelm9 小时前
Linux网络编程—TCP字典翻译系统
linux·开发语言·网络·c++·tcp/ip
hansang_IR9 小时前
【记录】「SCOI2016」三道模拟赛/26.7.12
c++·算法
会周易的程序员10 小时前
从零构建多核CPU负载自适应控制系统
linux·c++·笔记·物联网·测试工具