【C++ 单例模式】static MyLog * getInstance()详解

 


static MyLog * getInstance(); 是一个典型的单例模式(Singleton Pattern)中的成员函数声明。单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。

1、语法分析

static MyLog * getInstance();
  • static 关键字:表示该函数是一个静态成员函数。静态成员函数属于类本身,而不是类的某个具体对象。可以直接通过类名调用,无需创建类的实例
  • MyLog *:函数的返回类型,是一个指向 MyLog 类对象的指针。这意味着该函数会返回一个 MyLog 类的实例的地址。
  • getInstance:函数名,这是单例模式中常用的函数名,用于获取类的唯一实例。

1.1 实例地址

其中,使用 MyLog * getInstance() 返回 MyLog 类实例的地址(即指针),主要有以下几个原因,同时地址本身并不需要符合类的规则,但指针指向的对象需要符合该类的定义和规则:

为什么返回指针

1. 延迟初始化

单例模式中,有时候并不希望在程序启动时就创建实例,而是在第一次调用 getInstance() 时才进行创建,这就是延迟初始化。使用指针可以方便地实现这一点,因为可以先将指针初始化为 nullptr,在需要时再动态分配内存创建实例:

复制代码
class MyLog {
private:
    static MyLog* instance;
    MyLog() {}

public:
    static MyLog* getInstance() {
        if (instance == nullptr) {
            instance = new MyLog();
        }
        return instance;
    }
};
MyLog* MyLog::instance = nullptr;
复制代码

在上述代码中,通过判断 instance 是否为 nullptr 来决定是否创建新的实例,实现了延迟初始化

2、跨作用域访问

指针允许在不同的作用域中访问同一个对象。在单例模式中,全局访问点 getInstance() 可以在程序的任何地方被调用,返回的指针可以被传递到不同的函数或类中,方便在不同的地方使用同一个单例对象:

void someFunction() {
    MyLog* log = MyLog::getInstance();
    log->log("Message from someFunction");
}

在 someFunction 函数中,通过 getInstance() 获取单例对象的指针并使用它。

3. 多态性支持

如果 MyLog 类是一个基类,并且有派生类,使用指针可以支持多态性。可以返回指向派生类对象的基类指针,从而实现不同的行为:

复制代码
 1 class MyLog {
 2 public:
 3     virtual void log(const std::string& msg) {
 4         // 基类的日志记录实现
 5     }
 6     static MyLog* getInstance();
 7 };
 8 
 9 class DebugLog : public MyLog {
10 public:
11     void log(const std::string& msg) override {
12         // 派生类的日志记录实现
13     }
14 };
15 
16 MyLog* MyLog::getInstance() {
17     static MyLog* instance = new DebugLog();
18     return instance;
19 }
复制代码

在这个例子中,getInstance() 返回的是指向 DebugLog 对象的 MyLog 指针,通过虚函数实现了多态调用。

4、关于地址和类的关系地址本身:

  • 地址只是一个内存中的位置标识,它本身并没有类型信息,也不需要符合类的规则。地址只是一个整数,代表了内存中的一个特定位置。指针指向的对象:虽然地址本身没有类型,但指针是有类型的。
  • MyLog * 类型的指针意味着它指向的内存位置存储的是一个 MyLog 类的对象。这个对象必须符合 MyLog 类的定义和规则,包括拥有 MyLog 类的成员变量和成员函数,并且遵循 MyLog 类的访问控制规则(如私有成员只能在类内部访问)。
例如,当你通过指针调用 MyLog 类的成员函数时,编译器会根据指针的类型来检查调用是否合法:
MyLog* log = MyLog::getInstance();
log->log("Some message"); // 合法调用,因为 log 指向的是 MyLog 类对象

2、用途

单例模式通常用于以下场景:
  • 资源管理:当系统中某个资源只需要一个实例来管理时,例如日志记录器、数据库连接池等。使用单例模式可以确保所有代码都使用同一个资源实例,避免资源的重复创建和冲突。
  • 全局状态管理:在某些情况下,需要一个全局的状态对象来保存和管理系统的状态信息,单例模式可以提供一个统一的访问点。
 

 

posted @   taohuaxiaochunfeng  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示

目录导航