首页 > 编程语言 >C++ 单例模式三种写法

C++ 单例模式三种写法

时间:2023-07-25 22:11:05浏览次数:52  
标签:Singleton Apple ResourceManager MySpace C++ SayHello 单例 include 写法

#include <iostream>
#include "Apple.h"

#include "Singleton.h"
#include "ActivityManager.h"
#include "ResourceManager.h"
using namespace MySpace;

int main()
{
    Apple::abc = 10;
    //参考:https://blog.csdn.net/unonoi/article/details/121138176
    // 
    /*
    * 单例模式可以分为 懒汉式 和 饿汉式 ,两者之间的区别在于创建实例的时间不同。

    懒汉式
    系统运行中,实例并不存在,只有当需要使用该实例时,才会去创建并使用实例。这种方式要考虑线程安全。

    饿汉式
    系统一运行,就初始化创建实例,当需要时,直接调用即可。这种方式本身就线程安全,没有多线程的线程安全问题。
    */

    //方法一: 饿汉式单例(本身就线程安全), 在系统启动时就创建好了
    Apple& app = Apple::Instance();
    app.SayHello();
    //用宏方便写
    gApple.SayHello();


    //方法二:
    MySpace::ResourceManager::Instance().SayHello();

    
    //方法三: 使用一个单例宏
    MySpace::Singleton<ActivityManager>::instance().SayHello();
    ACTIVITY_MANAGER.SayHello();
    system("pause");
}

Apple.h

#pragma once
#include <iostream>
class Apple
{
public:
    static Apple& Instance() { return s_kInstance; }
    static int abc;
public:
    inline void SayHello() { std::cout << "Apple Hello" << std::endl; }
private:
    //Apple(); 没写, 这样CPP就不用写了
    //~Apple();

    Apple()
    {
        std::cout << "Apple Constructor" << std::endl;
    }
    static Apple s_kInstance;
};

#define gApple (Apple::Instance())

Apple.cpp

#include "Apple.h"
Apple Apple::s_kInstance;
int Apple::abc = 5;

ResourceManager.h

#pragma once
#include <iostream>

namespace MySpace
{
    class ResourceManager
    {
    public:
        static ResourceManager& Instance();
        void SayHello();
        ResourceManager()
        {
            std::cout << "ResourceManager Constructor" << std::endl;
        }
    };
}

 

ResourceManager.cpp

#include "ResourceManager.h"

using namespace MySpace;

ResourceManager& ResourceManager::Instance()
{
    static ResourceManager resMgr;
    return resMgr;
}
void ResourceManager::SayHello()
{
    std::cout << "ResourceManager Hello" << std::endl;
}

 

Singleton.h

#pragma once

namespace MySpace
{
    template<typename T>
    class Singleton
    {
    public:
        static T& instance()
        {
            static T t;
            return t;
        }

    private:
        Singleton();
        ~Singleton();
        Singleton(const Singleton&);
        Singleton& operator=(const Singleton&);
    };
}

 

ActivityManager.h

#pragma once
#include <iostream>

namespace MySpace
{
    class ActivityManager
    {
    public:
        void SayHello();
        ActivityManager()
        {
            std::cout << "ActivityManager Constructor" << std::endl;
        }
    };
    #define ACTIVITY_MANAGER MySpace::Singleton<ActivityManager>::instance()
}

 

ActivityManager.cpp

#include "ActivityManager.h"

using namespace MySpace;

void ActivityManager::SayHello()
{
    std::cout << "ActivityManager Hello" << std::endl;
}

 

下载

标签:Singleton,Apple,ResourceManager,MySpace,C++,SayHello,单例,include,写法
From: https://www.cnblogs.com/barrysgy/p/17581185.html

相关文章

  • 设计模式(1)-单例模式
    单例模式饿汉式懒汉式懒汉双加锁静态内部类C#特有写法破坏单例定义:有且仅有一个实例,节省资源。构造函数私有化静态只读私有字段静态公开的获取私有字段的方法饿汉式publicclassHungryMan{//构造函数私有化privateHungryMan(){}//静态只读私有字段......
  • python单例类
    Python单例类的实现方法概述在Python中,单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。在某些情况下,需要确保一个类的对象在整个程序中只被创建一次,以避免资源的浪费。本文将介绍如何在Python中实现单例类,并提供一个详细的步骤,以便新手开发者能够......
  • Eclipse for c/c++ 导入外面项目没有信息打印出来
      eclipseforc/c++ 导入外面项目没有信息打印出来: 就是因为这个Binaries里面二进制文件太多了,不知道运行哪一个,造成无输出,全删或只保留一个再编译运行: 运行成功:thevalueofsin(2.0)is0.909297TheIDofthisthreadis:-1202372520155============gett......
  • python使用ctypes调用gcc编译的dll之g++编译c++代码
    1、在windows系统将cpp代码编译成可供python调用的dll1.1新建header.h代码如下#pragmaonce#defineDllExport__declspec(dllexport)extern"C"{DllExportvoidhello_world(void);}/*#pragmaonce用来防止某个头文件被多次include,这条指令就能够保证头文件被......
  • [c/c++][考研复习笔记]内部排序篇学习笔记
    考研排序复习笔记插入排序#include<stdio.h>#include<stdlib.h>#defineMaxSize9//折半插入排序voidZBInsertSort(intA[],intn){ inti,j,high,low,mid; for(i=2;i<=n;i++){ A[0]=A[i]; low=1;high=i-1; while(low<=high){ mid=(low+high)/2......
  • C++强大、高性能、易于使用的format库
     fmtlib/fmt:Amodernformattinglibrary(github.com) {fmt} isanopen-sourceformattinglibraryprovidingafastandsafealternativetoCstdioandC++iostreams. DocumentationCheatSheetsQ&A:askquestionson StackOverflowwiththetagfmt.......
  • 设计模式—单例模式
    目录优点缺点使用场景注意事项案例分析定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。优点由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁地创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显。由......
  • C++20 Ranges简述
    C++20引入了范围(Ranges)的新特性,这是一种现代化的、功能强大的处理序列数据的机制。范围(Ranges)的目标是提供一种更简洁、更易读、更安全且更高效的方式来操作数据序列,代替传统的迭代器和手动循环操作。这里是C++20Ranges的一些详细解释:范围概念:范围(Ranges)是一种统一的序......
  • C++中定义一个二维数组
    在C++中定义二维数组有很多种方式1.第一种方式:定义一个二级指针(指向指针的指针)#include<iostream>usingnamespacestd;voidTraverse(int**p);intmain(){//two-dimensionarrayintm=3,n=5;int**arr=newint*[m];arr[0]=newint[n];arr[1......
  • C++11 可平凡复制类型 (TriviallyCopyable)
    可平凡复制类型标量类型(算数类型/枚举/指针)可平凡复制类类型可平凡复制类型的数组cv限定的可平凡复制类型(const/volatile)TriviallycopyableclassAtriviallycopyableclassisaclassthathasatleastoneeligiblecopyconstructor,moveconstructor,copyassi......