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
私は、ページを含む履歴書を実際に作成するために必要なのは、新しいものを作成することだけであるという状況をはるかに好みます。