新版MQL语言程序设计:单例模式的原理、应用及代码实现

文章目录

一、什么是单例模式

单例模式是创建型设计模式的一种,为了保证类仅有一个对象的解决方法。

二、为什么需要单例模式及应用场景

  • 节省公共资源 如果一个类被频繁地创建与销毁会影响整个系统的性能,单例模式保证一个类只有一个对象,并提供一个全局访问点,这样就不必频繁地创建和销毁对象。
  • 方便管理与控制 由于仅有一个实例存在,避免了多个实例之间的冲突,且数据与方法都是共享的,进而实现了统一管理和调用。
  • 应用范围 日志管理、打印机、数据库连接、应用配置,以上场景只需要创建一个实例就足够了,多个实例会出现冲突和资源的浪费。例如向日志里写入信息,多个对象写入就会出现日志管理的混乱。

三、单例模式的实现方法

  • 构造函数私有化:无法创建对象也无法使用new关键字创建对象,保证实例唯一性,代码中有详细演示。
  • 析构函数私有化:无法通过delete 关键字析构对象,保证对象生命周期,代码中有详细演示。
  • 静态函数访问或创建实例:通过类内部的方法创建或访问唯一对象。
  • 实例场景模式分懒汉式与饿汉式两种,具体代码实现如下:
cpp 复制代码
// 单例模式类
class Singleton
{
    public:
        // 静态方法,访问或创建唯一的对象
        static Singleton *Instance(void);
        // 该类的相关操作方法,这里只是演示。
        void              SingletonOperation(void);
        string            GetSingletonData(void);
    // 构造函数与析够函数私有化 new 与 delete 无法创建和析构对象了
    private:
        Singleton();
        ~Singleton();
    protected:
        static Singleton *uniqueInstance; // 统一的唯一实例
        string            singletonData;
};
// 懒汉与饿汉两者只能选一种模式
Singleton* Singleton::uniqueInstance=NULL;          // 懒汉式
//Singleton* Singleton::uniqueInstance=new Singleton; // 饿汉式

// 构造函数
Singleton::Singleton()
{
    Print("单例模式类的唯一对象 ", GetPointer(this)," 被创建了");
}
// 析构函数
Singleton::~Singleton()
{
    Print("单例模式类的唯一对象 ", GetPointer(this)," 被销毁了");
    // 析构函数私有化之后,只能在本类析构唯一的对象
    // 该对象的生命周期从创建开始,直到整个程序运行结束
    delete uniqueInstance;
}
// 相应的操作
void Singleton::SingletonOperation(void)
{
    Print("运行单例模式类的操作 > 设置单例模式类的对象数据");
    singletonData="singleton data";
}
// 获取数据
string Singleton::GetSingletonData(void)
{
    Print("读取并返回单例模式类的对象的数据");
    return singletonData;
}
// 仅创建一个对象
Singleton* Singleton::Instance(void)
{
    Print("单例模式的实例方法运行");
    if (!CheckPointer(uniqueInstance))
    {
        Print("单例模式的唯一实例为空");
        uniqueInstance=new Singleton;
        Print("分配给单例模式类的唯一实例");
    }
    Print("单例模式类的唯一对象: ",uniqueInstance);
    Print("返回单例模式类的唯一的实例对象地址: ", uniqueInstance);
    return uniqueInstance;
}
class Client
{
    public:
        string            Output(void);
        void              Run(void);
};
string Client::Output(void) {return __FUNCTION__;}
void Client::Run(void)
{
    // 构造函数私有化之,该类无法创建对象,也无法使用new关键字创建对象
    // Singleton tmp_obj;
    // Singleton *new_obj = new Singleton;

    // 只能使用静态方法创建和访问唯一的对象,保证实例对象唯一性
    Print("请求单例模式类的实例1");
    Singleton* instance1=Singleton::Instance();
    Print("请求单例模式类的实例2");
    Singleton* instance2=Singleton::Instance();
    string compareInstances= (instance1==instance2)?  "实例1 和 实例2 是同一个对象": "两个实例是不同的对象";
    Print(compareInstances);
    Print("请求对实例1 执行操作");
    instance1.SingletonOperation();
    Print("请求对实例2 执行操作");
    string singletonData=instance2.GetSingletonData();
    Print(singletonData);
    // 析构函数私优化,无法通过delete删除对象, 否则编译器报错
    //delete instance1;
}

// 用客户端创建一个对象
Client client;
// 运行函数。
void OnStart()
{
    client.Run();
}
相关推荐
T___6 小时前
从入门到放弃?带你重新认识 Headless UI
前端·设计模式
葬送的代码人生6 小时前
AI Coding→像素飞机大冒险:一个让你又爱又恨的小游戏
javascript·设计模式·ai编程
梦境虽美,却不长10 小时前
算法 学习 排序 2025年6月16日10:25:37
数据结构·学习·排序算法
全干engineer10 小时前
Web3-Web3.js核心操作:Metamask、合约调用、事件订阅全指南
开发语言·javascript·web3·区块链·智能合约
speop10 小时前
【datawhale组队学习】共读AI新圣经
人工智能·学习
羑悻的小杀马特11 小时前
从信息孤岛到智能星云:学习助手编织高校学习生活的全维度互联网络
c++·学习·生活·api
刘一说11 小时前
资深Java工程师的面试题目(六)数据存储
java·开发语言·数据库·面试·性能优化
江沉晚呤时11 小时前
EventSourcing.NetCore:基于事件溯源模式的 .NET Core 库
java·开发语言·数据库
火鸟211 小时前
Rust 通用代码生成器:莲花,红莲尝鲜版三十六,哑数据模式图片初始化功能介绍
开发语言·后端·rust·通用代码生成器·莲花·红莲·图片初始化功能
啾啾Fun11 小时前
Python类型处理与推导式
开发语言·windows·python