在www.dofactory.com 上,我找到了工厂模式的真实示例。但是代码会在 ReSharper 中生成关于构造函数中的虚拟成员调用的警告。
导致警告的代码如下:
abstract class Document
{
private List<Page> _pages = new List<Page>();
// Constructor calls abstract Factory method
public Document()
{
this.CreatePages(); // <= this line is causing the warning
}
public List<Page> Pages
{
get { return _pages; }
}
// Factory Method
public abstract void CreatePages();
}
class Resume : Document
{
// Factory Method implementation
public override void CreatePages()
{
Pages.Add(new SkillsPage());
Pages.Add(new EducationPage());
Pages.Add(new ExperiencePage());
}
}
在消费代码中,您可以简单地使用:
Document document = new Resume();
我确实理解为什么在构造函数中调用虚拟成员是一个坏主意(如此处所述)。
我的问题是如何重构它以便仍然使用工厂模式,但在构造函数中没有虚拟成员调用。
如果我只是CreatePages
从构造函数中删除调用,消费者将不得不显式调用该CreatePages
方法:
Document document = new Resume();
document.CreatePages();
我更喜欢Resume
实际创建包含页面的简历所需的全部内容的情况。