网站首页 > 技术文章 正文
I.3: Avoid singletons(避免单例)
Reason(原因)
Singletons are basically complicated global objects in disguise.
单例基本上就是一个复杂的全局对象的伪装。
Example(示例)
class Singleton { // ... lots of stuff to ensure that only one Singleton object is created, // that it is initialized properly, etc. };
There are many variants of the singleton idea. That's part of the problem.
存在许多单例想法的版本。这是问题的一个方面。
Note(注意)
If you don't want a global object to change, declare it const or constexpr.
如果你不希望全局对象发生改变,将其定义为常量或常量表达式。
译者注:常量表达式请参考https://mp.weixin.qq.com/s/Y_pEIVO8H6u-fpPczJU5Mw
Exception(例外)
You can use the simplest "singleton" (so simple that it is often not considered a singleton) to get initialization on first use, if any:
你可以使用最简单的“单例”(简单到经常不被认为是单例)以便在第一次使用时获取初始值。
X& myX() { static X my_x {3}; return my_x; }
This is one of the most effective solutions to problems related to initialization order. In a multi-threaded environment, the initialization of the static object does not introduce a race condition (unless you carelessly access a shared object from within its constructor).
这是解决初始化顺序相关问题的最有效手段。在多线程环境中,静态对象的的初始化不会触发竞争条件(除非你不小心在某个共享对象的构造函数中访问了它)
译者注:这也是目前单例设计模式在现代C++中最新实现。
Note that the initialization of a local static does not imply a race condition. However, if the destruction of X involves an operation that needs to be synchronized we must use a less simple solution. For example:
注意局部的静态变量不包含竞争条件。然而,如果X的析构动作牵涉到需要被同步的操作,我们必须使用一个次简单的解决方案。例如:
X& myX() { static auto p = new X {3}; return *p; // potential leak }
Now someone must delete that object in some suitably thread-safe way. That's error-prone, so we don't use that technique unless
现在某个角色必须以一种合适的线程安全的方式删除那个对象。由于容易引发错误,因此我们不会使用这个技术,除非
- myX is in multi-threaded code,myX就在多线程代码中
- that X object needs to be destroyed (e.g., because it releases a resource), andX对象需要被销毁(例如,因为它释放资源)
- X's destructor's code needs to be synchronized.X的析构函数的代码需要被同步。
译者注:函数内部构建的静态对象在程序退出时会被自动析构,如果希望自己控制析构的时机就只能动态构建对象以避开自动析构。
If you, as many do, define a singleton as a class for which only one object is created, functions like myX are not singletons, and this useful technique is not an exception to the no-singleton rule.
如果你像很多人一样为只创建一个的对象定义单例类,像myX那样的函数没有使用单例,这个有用的技术也不是禁止单例规格的例外。
译者注:做个做法不是单例,也就不会违反禁止单例的规则。
Enforcement(实施建议)
Very hard in general.
通常会十分困难。
- Look for classes with names that include singleton.
找到名称中包含singletong的类。
- Look for classes for which only a single object is created (by counting objects or by examining constructors).
找到只创建一个对象的类(通过对对象计数或检查(监控)构造函数)
- If a class X has a public static function that contains a function-local static of the class' type X and returns a pointer or reference to it, ban that.
如果类X有一个公开的静态函数,在其内部存在一个类型为X、作用域为该函数范围的局部静态变量并返回这个变量的指针或引用时,禁止它。
觉得本文有帮助?请分享给更多人。
更多更新文章,欢迎关注微信公众号【面向对象思考】
面向对象设计,面向对象编程,面向对象思考!
- 上一篇: C++单例模式跨DLL是不是就是会出问题?
- 下一篇: C++大厂面试真题宝典 精选100道
猜你喜欢
- 2024-09-24 学习C++之良好的编程习惯与编程要点
- 2024-09-24 大一萌新看过来,“这样”学C++,让你不再迷茫
- 2024-09-24 学习单例模式引发的思考
- 2024-09-24 C++中相互依赖的全局变量初始化策略
- 2024-09-24 零基础学习C++
- 2024-09-24 c++的面试总结
- 2024-09-24 避免踩坑,C++常见面试题的分析与解答
- 2024-09-24 20道必须掌握的C++题,纸上谈兵惯用伎俩
- 2024-09-24 C++11魔法静态变量magic static
- 2024-09-24 C++11 中值得关注的几大变化
你 发表评论:
欢迎- 02-20利用神经网络模型检测摄像头上的可疑行为
- 02-20直击心灵:高频核心听力你了解吗?_高频听力的正常范围值是多少
- 02-20YOLOv8 POSE+XGBoost进行人体姿态检测
- 02-20100个篮球英文术语详细解释,从此听懂NBA解说
- 02-20最全紧固件中英文对照,外贸必备词典一
- 02-20带你开发一个视频动态手势识别模型
- 02-20详细介绍一下Java基础中HashMap如何进行扩容操作?
- 02-20GTX 1070 Ti显卡评测:你会购买哪一款?
- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)