質問: abstract factoryとfactoryのデザインパターンの違いは何ですか? これら2つのパターンの違いについての投稿はたくさんありますが、見つけられないことがいくつかあります。私が読んできたことから、ファクトリメソッドパターンは単一の具体的な製品を作成する方法を定義することを可能にしますが、彼らは一般的な製品を見るのでクライアントから実装を隠します。私の最初の質問は抽象ファクトリーについてです。その役割は、1つの具象オブジェクトではなく、具体的なオブジェクトのファミリを作成することを許可することです(使用する特定のファクトリによって異なります)。抽象ファクトリは、どのメソッドを呼び出すかに応じて、1つの非常に大きなオブジェクトまたは多くのオブジェクトのみを返しますか?私の最後の2つの質問は、私が多くの場所で見たことを完全には理解できない一重引用符についてのものです。 両者の1つの違いは、抽象ファクトリパターンでは、クラスがコンポジションを介してオブジェクトのインスタンス化の責任を別のオブジェクトに委任するのに対し、ファクトリメソッドパターンは継承を使用し、サブクラスに依存して目的のオブジェクトのインスタンス化を処理することです。 私の理解するところでは、ファクトリメソッドパターンには、concretecreatorがどのconcreteproductをインスタンス化するかを知る責任を負うようにするcreatorインターフェースがあります。これは、オブジェクトのインスタンス化を処理するために継承を使用することによって何を意味するのでしょうか。さて、その引用に関して、abstract factoryパターンはどのように厳密にオブジェクトインスタンス化の責任を他のオブジェクトにコンポジションを通して委譲するのでしょうか。これは何を意味するのでしょうか? abstract factoryパターンでも継承プロセスを使用して構築プロセスを実行しているように見えますが、それでもやはりこれらのパターンについて学習しています。特に最後の質問に関しての手助けは大歓迎です。
回答: abstract factoryは生成されるべきオブジェクトのメソッドを定義する抽象メソッドで基本クラスを作成します。基本クラスを派生する各ファクトリクラスは、各オブジェクトタイプの独自の実装を作成できます。ファクトリメソッドは、クラス内にオブジェクトを作成するための単純なメソッドです。通常集約ルートに追加されます(orderクラスにはcreateorderlineというメソッドがあります)抽象的な工場以下の例では、メッセージングシステムからキューの作成を切り離し、コードベースを変更することなくさまざまなキューシステムの実装を作成できるようにインターフェイスを設計します。interface imessagequeuefactory { imessagequeue createoutboundqueue(string name); imessagequeue createreplyqueue(string name); } public class azureservicebusqueuefactory : imessagequeuefactory { imessagequeue createoutboundqueue(string name) { //init queue return new azuremessagequeue(/*....*/); } imessagequeue createreplyqueue(string name) { //init response queue return new azureresponsemessagequeue(/*....*/); } } public class msmqfactory : imessagequeuefactory { imessagequeue createoutboundqueue(string name) { //init queue return new msmqmessagequeue(/*....*/); } imessagequeue createreplyqueue(string name) { //init response queue return new msmqresponsemessagequeue(/*....*/); } } ファクトリーメソッドhttpサーバの問題は、リクエストごとに常にレスポンスが必要なことです。public interface ihttprequest { // .. all other methods .. ihttpresponse createresponse(int httpstatuscode); } ファクトリメソッドがなければ、httpサーバユーザ(つまりプログラマ)はihttprequestインタフェースの目的に反する実装固有のクラスを使わざるをえなくなるでしょう。したがって、レスポンスクラスの作成も抽象化されるようにファクトリメソッドを導入します。概要違いは、ファクトリメソッドオブジェクトを作成することはできません _を含むクラスの意図した目的 _は、オブジェクトを作成するためにのみ使用する必要があるということです。オブジェクトを作成するときにlsp( liskov substitution principle )を破るのは簡単なので、ファクトリメソッドを使用するときは注意が必要です。