前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Example】C++ 单例模式 演示代码 (被动模式、兼容VS2022编译)

【Example】C++ 单例模式 演示代码 (被动模式、兼容VS2022编译)

原创
作者头像
芯片烤电池
修改2022-04-28 10:07:04
5190
修改2022-04-28 10:07:04
举报
文章被收录于专栏:C++教程

什么是  Single Instance 单例模式?

单例模式是计算机程序设计当中一种常用思路,即软件系统运行当中,该类只允许拥有一个实例,且它必须在初始化的时候自己创建自己的实例。

那么单例模式主要是什么用途呢?

优化访问性能,便于进行数据共享。

比如说:

1,软件系统运行当中,业务上的配置文件参数共享。

2,多线程之间数据的共享。

3,调用类似于数据库操作这种需要频繁访问的对象时,减少 Object 的频繁创建销毁和函数调用的栈内存消耗。

4,数据需要临时保存时,给其他对象提供一个统一化的数据接口。

5,提升高度复用情况下的访问性能。

那么单例模式的具体实现方式是?

创建一个类,这个类会自己创建自己在内存当中的实例,实例可以被其他类访问,同时不允许以任何方式再次创建这个类的实例。

其中有什么原则?

1,必须保证在整个软件系统运行的生命周期当中,实例仅有一个,不能被再次创建,也不能被拷贝、赋值。

2,必须保证内存的安全性问题。

3,必须保证线程的安全性问题。

4,必须保证实例仅能通过指定的接口获得。

那么具体有什么细节?

1,可以通过将 构造、拷贝构造、赋值运算符重载 声明为 Private 以保证实例不会被再次创建。

2,可以通过智能指针进行包装,以保证内存的安全性。

3,可以通过使用 Static 关键字保证实例指针常驻于内存全局变量区。

4,可以使用 std::call_once 来保证类的实例只会创建一次,并且不会有线程安全问题。

单例模式分为主动模式和被动模式,区别是:

主动模式在类加载时就已经创建好了自己的实例。

被动模式在被第一次调用时才会创建自己的实例。

这里演示的是被动模式:

================== 创建一个叫大脑工具箱的“工具类” ==================

----------------- 头文件 ----------------- 

代码语言:javascript
复制
#pragma once
#include <memory>
using std::shared_ptr;
using std::make_shared;

#include <mutex>
using std::call_once;
using std::once_flag;

// 创建一个叫大脑工具箱的单例类
class BrainToolBox
{
public:
    // 获取单例的函数
    static shared_ptr<BrainToolBox> GetInstance();

public:
    // 供调用的测试函数
    void HelloByte();

private:
    // Private 锁死构造和析构
    BrainToolBox();
    ~BrainToolBox();

    // Private 锁死拷贝构造
    BrainToolBox(const BrainToolBox&) {};

    // Private 锁死赋值运算符
    BrainToolBox& operator=(const BrainToolBox&) {};

private:
    // 单例的指针声明
    static shared_ptr<BrainToolBox> BrainInstance;

    // Onec Flag 声明
    static once_flag BrainOnceFlag;

};

----------------- CPP文件 ----------------- 

代码语言:javascript
复制
#include <iostream>

#include "BrainToolBox.h"

// 单例的指针定义
shared_ptr<BrainToolBox> BrainToolBox::BrainInstance;

// OnceFlag 定义
once_flag BrainToolBox::BrainOnceFlag;

// 获取单例 如果不存在则创建且只创建一次
shared_ptr<BrainToolBox> BrainToolBox::GetInstance()
{
    call_once(BrainToolBox::BrainOnceFlag, [&] {
        struct make_shared_enabler : BrainToolBox{};
        BrainToolBox::BrainInstance = make_shared<make_shared_enabler>();
    });
    return BrainToolBox::BrainInstance;
}

// 测试输出一段字符串以确定单例类被成功创建
void BrainToolBox::HelloByte()
{
    std::cout << "Hello Byte!" << std::endl;
    return;
}

// 构造
BrainToolBox::BrainToolBox()
{

}

// 析构
BrainToolBox::~BrainToolBox()
{

}

================== 测试一下 ==================

代码语言:javascript
复制
#include "BrainToolBox.h"

int main()
{
    shared_ptr<BrainToolBox> tool = BrainToolBox::GetInstance();
    tool->HelloByte();
 
}

会打印 Hello Byte 字符串。

====================================

芯片烤电池 C++ Example 2022-Spring Season Pass :

【Example】C++ 标准库常用容器全面概述

【Example】C++ 回调函数及 std::function 与 std::bind

【Example】C++ 运算符重载

【Example】C++ 标准库智能指针 unique_ptr 与 shared_ptr

【Example】C++ 接口(抽象类)概念讲解及例子演示

【Example】C++ 虚基类与虚继承 (菱形继承问题)

【Example】C++ Template (模板)概念讲解及编译避坑

【Example】C++ 标准库 std::thread 与 std::mutex

【Example】C++ 标准库多线程同步及数据共享 (std::future 与 std::promise)

【Example】C++ 标准库 std::condition_variable

【Example】C++ 用于编译时封装的 Pimpl 演示 (编译防火墙 Private-IMPL)

【Example】C++ 单例模式 演示代码 (被动模式、兼容VS2022编译)

====================================

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档