На www.dofactory.com я нашел реальный пример шаблона Factory. Но код генерирует предупреждение в 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
— это все, что нужно для фактического создания Резюме, содержащего страницы.