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


什么是  Single Instance 单例模式?

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

 

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

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

 

比如说:

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

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

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

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

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

 

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

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

 

 

其中有什么原则?

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

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

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

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

 

那么具体有什么细节?

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

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

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

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

 

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

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

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

 

 

这里演示的是被动模式:

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

 

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

#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文件 ----------------- 

#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()
{

}

 

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

#include "BrainToolBox.h"

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

会打印 Hello Byte 字符串。

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
【Example】C++ 单例模式演示 (被动模式、兼容VS2022编译) 【Example】C++ 单例模式演示 (被动模式、兼容VS2022编译) 【Example】C++ 单例模式演示 (被动模式、兼容VS2022编译) 【Example】C++ 单例模式演示 (被动模式、兼容VS2022编译)   TRANSLATE with 【Example】C++ 单例模式演示 (被动模式、兼容VS2022编译) COPY THE URL BELOW 【Example】C++ 单例模式演示 (被动模式、兼容VS2022编译) 【Example】C++ 单例模式演示 (被动模式、兼容VS2022编译) Back EMBED THE SNIPPET BELOW IN YOUR SITE 【Example】C++ 单例模式演示 (被动模式、兼容VS2022编译) Enable collaborative features and customize widget: Bing Webmaster Portal Back
上一篇:php类知识---魔术方法__toString,__call,__debugInfo


下一篇:Maven学习 (二) Eclipse 上安装 Maven3插件