実際、この両方のパターンには明確な分離があります。具象型からの依存を避けるために両方のパターンが使用されることはよく知られています。
しかし、読んだ後
いくつかの深刻な矛盾が生じます。
Seemann 氏は次のように述べています。
Rober C. Martin はジェネリック型については何も言及していませんでしたが、彼の本のファクトリの例では、Factory.Make() のパラメーターとしてキー文字列を使用して、複数の型のオブジェクトのインスタンスを作成できます。
ガンマ氏によると、Abstract Factory の目的は、「具体的なクラスを指定せずに、関連オブジェクトまたは依存オブジェクトのファミリを作成するためのインターフェイスを提供する」ことです。Gamma Abstract Factory の例は、Martin が述べた Interface Segregation Principle (ISP) に違反していることに言及する価値があります。一般に、ISP と SOLID はより現代的な原則であるか、単純化のために省略されている場合があります。
Gamma と Martin の作品は Seemann の作品に先行しているので、彼は既に作成された定義に従うべきだと思います。
Fowler は Service Locator を Dependency Inversion を実装する方法として提案していますが、Seemann はそれをアンチパターンと考えています。Gamma も Martin も Service Locator について言及していません。
ただし、Seemann と Fowler は、Service Locator が具体的なクラスのインスタンスを登録するための構成手順を必要とすることに同意しました。そのインスタンスは、その種類のオブジェクトが要求されたときに後で返されるものです。この構成ステップは、Abstract Factory の定義で Martin または Gamma によって言及されていません。抽象ファクトリ パターンでは、その種類のオブジェクトが要求されるたびに新しいオブジェクトがインスタンス化されると仮定します。
結論
Service Locator と Abstract Factory の主な違いは、Abstract Factory では新しいオブジェクトがインスタンス化され、要求されるたびに返されると仮定し、Service Locator はオブジェクト インスタンスで構成する必要があり、毎回同じインスタンスが返されることです。