在我的项目中,我有一系列类,出于特定原因,它们的实例由某个管理器类管理。
例子是:
CSound - Abstracts a single sound
CSoundManager - Friend of CSound, provides factory methods for creating CSound instances, mixes active sounds together
还有:CFont、CFontManager(用于按名称访问字体)、CSprite、CSpriteManager(用于绘制每一帧),等等。
这里是我的第一个问题:
- 我正在做的是一个特定的命名设计模式吗?
- 在大多数情况下,无论出于何种原因,这都是一个坏主意吗?如果是,为什么?
然后,我问自己:
- 应该如何创建和销毁对象?我应该允许在堆栈上或直接使用
new
创建它们,还是只允许通过相应管理器类的方法创建它们?
(也用于销毁:delete myFont;
与 FontManager.DestroyFont( myFont );
)
最佳答案
听起来你可能违反了 The Single Responsibility Principle (SRP)原则。
CSoundManager
类是负责创建和管理CSound
对象的生命周期,还是负责将事件声音混合在一起?名字可以告诉你很多,而“经理”可以有太多的理解......
通常,如果您希望这些 Manager 类处理对象的生命周期,那么它们很可能是实例化这些对象(即对象中的私有(private) ctors)的唯一方法。查看Factory Design Pattern ,尽管您的实现有点不同。
如果您这样做,则客户端代码应该永远不会调用new
或delete
。手动调用 delete
容易出错,应避免使用 RAII 等惯用语。 .在这种特殊情况下,Manager 类应该管理对象的生命周期,因此 delete
永远不会出现在客户端代码中。
关于C++:不确定类 - 类管理器关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5236452/