C ++:组织程序子系统的正确方法是什么?

时间:2011-03-01 20:37:05

标签: c++ design-patterns singleton global-variables modularity

想象一下,你有一个大型的应用程序项目,代码被分成一系列子系统,这些子系统是从CBaseSubsystem派生的类实现的。

这是我的第一个问题:

  • 将子系统组织为类[从基类派生]是不是一个好主意?

然后,您拥有子系统类。现在,您需要在某处创建具有它们的实例。但在哪里?

  • 将每个子系统实例存储在全局变量中是个好主意,例如:
    extern CEventSystem* g_EventSystem;

  • 实际应该在哪里创建实例?一起在main()函数中?

  • 或者,最好是完全避免全局变量并在CSubsystemManager类等中组织实例?

  • 使用单例类是一种合适的方法吗?

4 个答案:

答案 0 :(得分:1)

this非常相似。我会避免使用Singleton,因为这里绝对没有必要并带来many other issues

在类似main的例程中创建实例。如果某些东西需要系统,通过某种方式提供对它的访问,无论是直接传递给某个东西的参数,还是提供对这些系统的访问的容器(IE:CSubSystemManager)。您可能不需要编写CSubSystemManager。

避免全球状态,这是一个耻辱的原因。

答案 1 :(得分:0)

如果你需要一种方法来访问每个子系统的实例,我会避免使用“extern”,而是使用一个单例,它可以访问CSubsystemManager的一个实例。管理器本身可以负责实例化和管理子系统对象。

答案 2 :(得分:0)

如果你想谈论理论而不是提出具体问题,那么考虑根据FactorySingleton的组合进行设计,并在子系统中实现Strategy的可能性对一系列不同对象类型的类似操作。

主要子系统工厂本身就是一个单身人士,其目的是希望显而易见。使用延迟评估仅允许根据需要加载所需的子系统对象。您可能需要考虑为每个子系统提供一个引用计数机制,以便在不再需要时将其删除。一些子系统本身可以是单例和/或也​​可以实现策略模式以为一系列类类型提供特定服务。 该服务可以是例如验证,渲染,序列化等。

以这种方式构建应用程序是否是一个“好主意”的价值判断不是我要说的。我宁愿让老智慧说出来。

答案 3 :(得分:0)

我的解决方案将创建一个单例注册表,AbstractFactory和Factory的组合。

//in base module

class ISubsystem{} //an interface for a subsystem

//in module code
Registry::instance()->registerFactory("subsystem1",new Subsystem1Factory());

//in user code
IFactory* factory = Registry::instance()->getFactory("subsystem1");
ISubsystem* subsystem = factory->createObject(...); //you can implement whatever policy in factory impl. (like singleton etc.)