それらが何であるか、そしてなぜ私たちはそれらを持っているのかを自問してください。どちらもオブジェクトのインスタンスを作成するためにあります。
ElementarySchool school = new ElementarySchool();
ElementarySchool school = SchoolFactory.Construct(); // new ElementarySchool() inside
これまでのところ違いはありません。ここで、さまざまな学校タイプがあり、ElementarySchoolの使用からHighSchool(ElementarySchoolから派生するか、またはElementarySchoolと同じインターフェースISchoolを実装する)に切り替えたいとします。コードの変更は次のようになります。
HighSchool school = new HighSchool();
HighSchool school = SchoolFactory.Construct(); // new HighSchool() inside
インターフェースの場合、次のようになります。
ISchool school = new HighSchool();
ISchool school = SchoolFactory.Construct(); // new HighSchool() inside
このコードが複数の場所にある場合、ファクトリメソッドを変更すると完了しているため(インターフェイスで2番目の例を使用している場合)、ファクトリメソッドの使用はかなり安価であることがわかります。
そして、これが主な違いと利点です。複雑なクラス階層の処理を開始し、そのような階層からクラスのインスタンスを動的に作成する場合は、次のコードを取得します。次に、ファクトリメソッドは、インスタンス化する具体的なインスタンスをメソッドに通知するパラメータを取得します。MyStudentクラスがあり、対応するISchoolオブジェクトをインスタンス化して、生徒がその学校のメンバーになるようにするとします。
ISchool school = SchoolFactory.ConstructForStudent(myStudent);
これで、さまざまなIStudentオブジェクトに対してインスタンス化するISchoolオブジェクトを決定するビジネスロジックを含む1つの場所がアプリにあります。
したがって、単純なクラス(値オブジェクトなど)の場合はコンストラクターで十分です(アプリケーションをオーバーエンジニアリングしたくない)が、複雑なクラス階層の場合はファクトリーメソッドを使用することをお勧めします。
このようにして、4冊の本「プログラムをインターフェイスではなく実装にする」の最初の設計原則に従います。