【发布时间】:2008-12-12 17:12:20
【问题描述】:
我有一个包含多个对象的应用程序(到目前为止大约 50 个,但还在增长)。应用程序中每个对象只有一个实例,并且这些实例在组件之间共享。
我所做的是从基础 BrokeredObject 类派生所有对象:
class BrokeredObject
{
virtual int GetInterfaceId() = 0;
};
并且每个对象类型都返回一个唯一的 ID。这些 ID 保存在头文件中。
然后我有一个 ObjectBroker“工厂”。当有人需要一个对象时,调用 GetObjectByID()。 boker 在 STL 列表中查找对象是否已经存在,如果存在,则返回它。如果没有,它会创建它,将其放入列表中并返回它。一切顺利。
BrokeredObject *GetObjectByID(int id)
{
BrokeredObject *pObject;
ObjectMap::iterator = m_objectList.find(id);
// etc.
if(found) return pObject;
// not found, so create
switch(id)
{
case 0: pObject = new TypeA; break;
case 1: pObject = new TypeB; break;
// etc.
// I loathe this list
}
// add it to the list
return pObject;
}
我觉得痛苦的是维护这个 ID 列表并且必须让每个类都实现它。通过让每种类型都保存有关其自己的 ID 的信息,我至少让我的消费者的生活稍微轻松了一点,如下所示:
class TypeA : public BrokeredObject
{
static int get_InterfaceID() { return IID_TYPEA; }
int GetInterfaceID() { return get_InterfaceID(); }
};
所以我可以得到这样的对象:
GetObjectByID(TypeA::get_InterfaceID());
不必真正知道 ID 映射是什么,但我仍然对维护和潜在的错误不感兴趣。好像知道类型,为什么还要知道ID呢?
我渴望在 C# 中是这样的:
BrokeredObject GetOrCreateObject<T>() where T : BrokeredObject
{
return new T();
}
ObjectBroker 将根据传入的 type 创建对象。
C# 宠坏了我吗?C++ 无法做到这一点已是不争的事实,还是有一种我没有看到的方法来实现这一点?
【问题讨论】:
-
您能否详细说明 C# 示例中的内容?我认为您还有其他不清楚的要求。
-
不要使用 STL 列表,而是使用 map 或 hash_map。如果您有很多对象或经常获取它们,则 list::find 可能会慢很多。
-
“应用程序中每个对象只有一个实例”:哎哟...
标签: c++ design-patterns