用于初始化未知子类的模式

时间:2009-08-20 08:41:55

标签: design-patterns oop

我正在尝试制作一个像这样的函数f:

StorageObject::addItem (const AbstractBase& base) {
    AbstractBase* storage = new Derived1(base);
}

但是,我希望f能够使用Derived2,Derived3等类。有没有办法让f调用正确的构造函数,具体取决于传递给它的AbstractBase的特定子类,而不使用类型代码?

要将问题放在上下文中,我使用此函数初始化类中的对象列表。虽然我可以做类似

的事情
Derived1* temp = new Derived1();
storageobject.addItem(*temp);
delete temp;

我更愿意做像

这样的事情
storageobject.addItem(Derived1());

并让storageobject处理所有内容。

2 个答案:

答案 0 :(得分:2)

为什么不实施虚拟副本方法?

AbstractBase* storage = base.Copy()

顺便说一句,这是C ++特有的,因为使用C#可以简单地通过反射来实现。

Activiator.CreateInstance(temp.GetType(), temp);

当然,周围有一些不错的工厂模式,但这实际上取决于你需要解决的具体问题。

答案 1 :(得分:0)

  • 如果您可以使用模板。
  • 如果您没有语言模板 - 请使用抽象工厂模式