Factoryパターンの流行は、「new」キーワードの使用は不適切であり、すべてのコスト(または最小集中化)。これは、単一責任原則(SOLIDの「S」)、および依存関係反転原則(「D」)の非常に厳密な解釈に由来しています。簡単に言えば、SRPは理想的にはコードオブジェクトには「変更する理由」が1つだけあるべきだと言っています。「変更の理由」がそのオブジェクトの中心的な目的であり、コードベースでの「責任」であり、コードの変更を必要とするものはすべて、そのクラスファイルを開く必要はありません。DIPはさらにシンプルです。コードオブジェクトが別の具体的なオブジェクトに依存することはありません。
適切な例として、「new」とパブリックコンストラクターを使用して、呼び出し元のコードを特定の具象クラスの特定の構築メソッドに結合しています。コードは、クラスMyFooObjectが存在し、文字列とintを受け取るコンストラクタを持っていることを知る必要があります。そのコンストラクターがさらに情報を必要とする場合は、コンストラクターのすべての使用法を更新して、現在記述しているものを含むその情報を渡す必要があるため、渡すために有効なものが必要です。それを取得するために変更する(消費オブジェクトに責任を追加する)。さらに、コードベースでMyFooObjectがBetterFooObjectに置き換えられた場合、古いクラスではなく新しいオブジェクトを作成するために、古いクラスの使用法をすべて変更する必要があります。
したがって、代わりに、MyFooObjectのすべてのコンシューマーは、MyFooObjectを含むクラスを実装する動作を定義する「IFooObject」に直接依存する必要があります。現在、IFooObjectsのコンシューマーは、IFooObjectを構築することはできません(特定の具体的なクラスが必要ないIFooObjectであるという知識がないため)。外部から、状況に応じて正しいIFooObjectを作成する方法を知る責任がある別のオブジェクトによって。このオブジェクトは、この用語では通常ファクトリと呼ばれます。
さて、ここで理論が現実と出会うところです。オブジェクトを常にすべての種類の変更に対して閉じることはできません。代表的な例として、IFooObjectはコードベース内の追加のコードオブジェクトになり、コンシューマーまたはIFooObjectsの実装に必要なインターフェイスが変更されるたびに変更する必要があります。これにより、この抽象化を介してオブジェクトが相互にやり取りする方法を変更することに伴う新しいレベルの複雑さが導入されます。さらに、インターフェース自体が新しいインターフェースに置き換えられた場合、コンシューマーはさらに変更する必要があり、さらに深くする必要があります。
優れたコーダーは、デザインを分析し、特定の方法で変更する必要がある可能性が非常に高い場所を見つけて、より寛容になるようにリファクタリングすることで、YAGNI(「あなたは必要ない」)とSOLIDのバランスを取る方法を知っていますその場合、「あなたはそれを必要としている」からです。