关于 singleton 还是全局对象的我的一点建议

本文探讨了单例模式和全局对象的区别与应用场景,分析了它们的特点并提出了一个名为 InitSingleton 的模式,该模式能够在运行时确保全局唯一性。
  到底是用singleton 还是 全局对象?看了一些文章,但是还是不是很清晰。自己整理一下。
  singleton特点: 1 使用时分配,如不使用则不分配。
                        2 保证全局只有唯一对象
  全局对象特点: 1 应用程序初始化时分配 结束时销毁
                        2 可以生成新的类的对象
 
  我觉得考虑这一点: 全局的引用数量是否会经常变成0。如果这样的话,singleton模式会经常创建和销毁对象,产生不必要的额外开销。而如果可以认为基本上全局引用数量不会为零,即必然会引用,那么推迟初始化有什么意义呢?我认为在这一点上,只有下面2种情况下 singleton才优于 全局对象: 1该对象要么引用数为0,一但引用数多于0,那么会保持很长时间不会变为0。2系统对空间要求高,对时间要求低。即需要拿时间换取空间。
  而另外一点,singleton可以保证全局只有一个该类的实例,而全局对象不可以。最初我认为这是一个很好的模式。但后来经过仔细思考后发觉,singleton似乎没有用。singleton保证全局唯一实例的目的在于什么?在于保证开发者不会无意的用该类生成其它实例。singleton是通过私有化构造函数来实现的。我有一个方法,是使用一个静态成员函数记录生成对象数,并在初始化时考察该数量,如果该数量大于1,则抛出异常。这样来保证系统中只有唯一该类的实例。下面是示例代码:
 
 
#include <exception>
#include <iostream>
#include <assert.h>
class AA{
public:
        AA()
        {
                nRef++;
                assert(nRef==1);
        }
        static int nRef;
};
int AA::nRef=0;
int main()
{
        cout<<"beforea1"<<endl;
        AA a1;
        cout<<"beforea2"<<endl;
        AA a2;
        cout<<"beforea3"<<endl;
        AA a3;
        cout<<"after all"<<endl;
}
运行结果如下
beforea1
beforea2
a.out: a.cpp:10: AA::AA (): Assertion `nRef==1' failed.
Aborted
显然在构造第二个对象的时候产生了异常。
相比之下,singleton是编译时保证全局唯一性,我的方法(暂时自称 Init Singleton 模式)是在运行时保证全局的唯一性。而同时兼有全局对象用法的优点。
在这里提出这种模式供大家讨论。
内容概要:本文介绍了一个针对电力系统连锁故障传播路径的N-k多阶段双层优化及故障场景筛选模型,该模型基于混合整数线性规划(MILP)方法构建,旨在全面评估电力系统在遭受多重故障时的脆弱性与恢复能力。通过引入故障传播路径的概念,模型能够动态模拟故障在电网中的逐级扩散过程,并结合多阶段优化策略,实现对关键故障场景的有效识别与优先排序。整个框架不仅考虑了初始故障元件的选取,还涵盖了后续因潮流转移引发的级联跳闸行为,从而提升了风险评估的准确性与时效性。该研究已在Matlab平台上完成代码实现,具备良好的可复现性和工程应用价值,适用于提升现代电网的安全防御水平。; 适合人群:电力系统、能源安全及相关领域的科研人员、高校研究生以及从事电网规划与运行管理的工程技术人员。; 使用场景及目标:①用于电力系统安全评估中识别最危险的N-k故障组合;②支撑电网应急预案制定与薄弱环节改造;③作为学术研究中关于级联故障建模与优化求解的教学与验证工具;④服务于智能电网背景下抵御蓄意攻击或极端事件的风险防控决策。; 阅读建议建议读者结合Matlab代码深入理解模型的数学 formulation 与求解流程,重点关注目标函数设计、约束条件构建及双层优化结构的实现逻辑,同时可通过调整系统参数和故障设定进行仿真对比分析,以掌握不同因素对连锁故障演化的影响规律。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值