C ++:不确定类 - 类管理器关系

时间:2011-03-08 18:06:25

标签: c++ oop design-patterns

在我的项目中,我有一系列的课程,其中的实例由某些经理课程管理,具体原因。

例子如下:

  

CSound - 摘录一个声音

     

CSoundManager - CSound的朋友,   提供工厂创建方法   CSound实例,混合有效声音   一起

另外:CFont,CFontManager(用于每个字体的字体访问),CSprite,CSpriteManager(用于绘制每个帧),等等。

这是我的第一个问题:

  • 我正在做一个特定的命名设计模式吗?
  • 在大多数情况下,无论出于何种原因,这是一个坏主意?如果是,为什么?

然后,我问自己:

  • 如何创建和销毁对象?我是应该允许在堆栈上创建它们还是直接使用new创建它们,还是仅允许通过相应管理器类的方法创建它们?

(也适用于销毁:delete myFont;与。FontManager.DestroyFont( myFont );

3 个答案:

答案 0 :(得分:1)

听起来你可能违反了The Single Responsibility Principle (SRP)原则。

CSoundManager类负责创建和管理CSound个对象的生命周期,还是负责将活动声音混合在一起?名字可以告诉你很多,“经理”可以用太多方式理解......

通常,如果您希望这些Manager类处理对象的生命周期,那么它们很可能是实例化这些对象(即对象中的私有ctors)的唯一方法。请参阅Factory Design Pattern,尽管您的实施方式略有不同。

如果您这样做,那么客户端代码永远不会调用newdelete。手动调用delete容易出错,应该使用RAII这样的习惯用法来避免。在这种特殊情况下,Manager类应该管理对象的生命周期,因此delete永远不会出现在客户端代码中。

答案 1 :(得分:0)

看起来您正在使用某种形式的工厂设计模式。不确定是什么让你觉得这是一个坏主意。

如果您将Manager视为对象的容器,那么它将控制这些对象的生命周期。但是,如果您的对象需要超出Manager的生命,那么您将使用new创建它们,而Manager可能不会对销毁负责。

答案 2 :(得分:0)

通常,您要实现的是工厂方法模式,其中对象分配另一个对象。但是,您并没有从工厂类中获益,因为您直接将分配的类型绑定到工厂,而不是允许工厂抽象地管理所有内部。例如,你可以从任何文件,或只是该资源类型的工厂(CSoundManager)执行此操作:new CSound();

如果是这样,你就错过了这一点,你基本上只有一个Singleton来分配和管理一个对象。考虑抽象您的资源类型。如果CSound和CFont派生自IResource,你可以拥有一个CResourceManager,只需要为该类型获取枚举或某种标识符,并减少代码库中的耦合和依赖。每当您需要使用该对象时,您可以公开该类型,但更可能的是您可以使用抽象管理器(CResourceManager)使用公共接口处理这些对象(Update(),Create(),Destroy()等...)

对于您的声音管理器案例,请记住声音只需要加载一次,并且可以使用唯一的状态进行实例化。在那个权利中,让资源管理器管理实际资源(CSound),声音管理器(CSoundManager)维护离散实例(例如CSoundInstance)并管理混合(通过CSoundMixer)。以有意义的方式专业化您的课程,以管理复杂性并减少冗余。

我使用声音管理器作为示例,但这适用于大多数io系统(图形,输入,物理)。