想象一下,你有一个大型的应用程序项目,代码被分成一系列子系统,这些子系统是从CBaseSubsystem派生的类实现的。
这是我的第一个问题:
然后,您拥有子系统类。现在,您需要在某处创建具有它们的实例。但在哪里?
将每个子系统实例存储在全局变量中是个好主意,例如:
extern CEventSystem* g_EventSystem;
实际应该在哪里创建实例?一起在main()函数中?
或者,最好是完全避免全局变量并在CSubsystemManager
类等中组织实例?
使用单例类是一种合适的方法吗?
答案 0 :(得分:1)
与this非常相似。我会避免使用Singleton,因为这里绝对没有必要并带来many other issues。
在类似main的例程中创建实例。如果某些东西需要系统,通过某种方式提供对它的访问,无论是直接传递给某个东西的参数,还是提供对这些系统的访问的容器(IE:CSubSystemManager)。您可能不需要编写CSubSystemManager。
避免全球状态,这是一个耻辱的原因。
答案 1 :(得分:0)
如果你需要一种方法来访问每个子系统的实例,我会避免使用“extern”,而是使用一个单例,它可以访问CSubsystemManager的一个实例。管理器本身可以负责实例化和管理子系统对象。
答案 2 :(得分:0)
如果你想谈论理论而不是提出具体问题,那么考虑根据Factory和Singleton的组合进行设计,并在子系统中实现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.)