私の推定では、@ TomDallingによって与えられた答えは確かに正しいです(それが価値があるものについて)が、コメントにはまだ多くの混乱があるようです。
ここで私が行ったことは、2つのパターンの少し変わった例をいくつか作成し、それらを一見非常によく似たものに見せようとしたことです。これは、それらを分離する重要な違いを特定するのに役立ちます。

パターンに完全に慣れていない場合、これらの例はおそらく開始するのに最適な場所ではありません。
ファクトリメソッド

Client.javaish
Client(Creator creator) {
ProductA a = creator.createProductA();
}
Creator.javaish
Creator() {}
void creatorStuff() {
ProductA a = createProductA();
a.doSomething();
ProductB b = createProductB();
b.doStuff();
}
abstract ProductA createProductA();
ProductB createProductB() {
return new ProductB1();
}
なぜとがありCreatorますClientか?
なぜだめですか?はFactoryMethod両方で使用できますが、Creator作成される特定の製品を決定するのはそのタイプになります。
なぜcreateProductB抽象化されないのCreatorですか?
デフォルトの実装を提供できますが、サブクラスはメソッドをオーバーライドして独自の実装を提供できます。
ファクトリメソッドは1つの製品しか作成しないと思いましたか?
各メソッドは1つの製品のみを返しますが、作成者は複数のファクトリメソッドを使用できます。これらは、必ずしも特定の方法で関連付けられているわけではありません。
抽象ファクトリ

Client.javaish
AbstractFactory factory;
Client() {
if (MONDAY) {
factory = new Factory2();
} else {
factory = new AbstractFactory();
}
}
void clientStuff() {
ProductA a = factory.createProductA();
a.doSomething();
ProductB b = factory.createProductB();
b.doStuff();
}
待って!あなたAbstractFactoryはそうではありません、まあ...
それは大丈夫です、私たちはまだインターフェースを提供しています。createメソッドのreturnタイプは、作成したい製品のスーパータイプです。
聖なる煙バットマン!Factory2オーバーライドしませんcreateProductA()、「製品のファミリ」はどうなりましたか?
パターンには、オブジェクトが複数のファミリに属することはできないということは何もありません(ただし、ユースケースで禁止されている場合があります)。各コンクリート工場は、どの製品を一緒に作成できるかを決定する責任があります。
それは正しくありえません、Client依存性注入を使用していません
具体的なクラスをどこかに配置するかどうかを決定する必要がありますが、Clientそれでもインターフェイスに書き込まれAbstractFactoryます。
ここでの混乱は、人々が依存性注入と構成を混同していることです。HAS-Aは、どのように入手したかに関係なく。IS-A関係とは対照的であり、それらの間に継承はありません。ClientAbstractFactoryClientAbstractFactory
主な違い
- 抽象ファクトリは常にオブジェクトのファミリに関するものです
- ファクトリメソッドは、サブクラスが具象オブジェクトのタイプを指定できるようにする単なるメソッドです。
- 抽象ファクトリはクライアントへのインターフェイスを提供し、製品が使用される場所とは別のものです。ファクトリメソッドは、作成者自身が使用することも、クライアントに公開することもできます。
概要
ファクトリの目的は、クライアントまたはそれ自体のいずれかにオブジェクトを提供することです。
作成者には独自の責任があり、オブジェクトを使用するか、クライアントに渡す必要がある場合があります
オブジェクトを作成するためのインターフェースを定義しますが、インスタンス化するクラスをサブクラスに決定させます。ファクトリメソッドを使用すると、クラスはインスタンス化をサブクラスに延期できます。-GoF
抽象ファクトリのみ:
具体的なクラスを指定せずに、関連オブジェクトまたは依存オブジェクトのファミリーを作成するためのインターフェースを提供します。-GoF
ダイアグラムで遊びたい場合は、PlantUMLコード:
@startuml FactoryMethod
abstract class Creator {
creatorStuff()
{abstract} createProductA(): ProductA
createProductB(): ProductB
}
class Creator1 {
createProductA(): ProductA
}
class Creator2 {
createProductA(): ProductA
createProductB(): ProductB
}
together {
interface ProductA {
doSomething()
}
class ProductA1
' class Product1B
}
together {
interface ProductB {
doStuff()
}
class ProductB1
class ProductB2
}
Client --> Creator
Creator <|-- Creator1
Creator <|-- Creator2
Creator --> ProductB1
ProductA1 <-- Creator1
ProductA1 <-- Creator2
ProductB2 <-- Creator2
ProductA <|.. ProductA1
ProductB <|.. ProductB1
ProductB <|.. ProductB2
ProductA <- Creator
@enduml
@startuml AbstractFactory
together {
interface ProductA {
doSomething()
}
class ProductA1
}
together {
interface ProductB {
doStuff()
}
class ProductB1
class ProductB2
}
class AbstractFactory {
createProductA(): ProductA
createProductB(): ProductB
--
-
}
class Factory2 {
createProductB(): ProductB
}
Client --> AbstractFactory
AbstractFactory <|-- Factory2
ProductA <|.. ProductA1
ProductB <|.. ProductB1
ProductB <|.. ProductB2
AbstractFactory --> ProductA1
AbstractFactory --> ProductB1
ProductB2 <-- Factory2
@enduml