コンセプト
ファクトリ メソッド パターン (ファクトリ メソッド パターン) は、ファクトリ パターンとも呼ばれ、仮想コンストラクター (仮想コンストラクター) パターンまたはポリモーフィック ファクトリ (ポリモーフィック ファクトリ) パターンとも呼ばれ、クラス作成パターンに属します。
ファクトリ メソッド パターンは、「ファクトリ」の概念を実装するオブジェクト指向の設計パターンです。他の作成パターンと同様に、具体的なタイプを指定せずにオブジェクトを作成することも扱います。
ファクトリ メソッド パターンの本質は、「オブジェクトを作成するためのインターフェイスを定義しますが、どのクラスをインスタンス化するかは、このインターフェイスを実装するクラスに決定させます。ファクトリ メソッドは、クラスのインスタンス化をサブクラスに任せます。」です。
使用
ファクトリ メソッド パターンと [単純なファクトリ パターン][2] はどちらもファクトリを使用してオブジェクトを作成しますが、それらの最大の違いは、ファクトリメソッド パターンが「[開閉原則][3]」に完全に準拠するように設計されていることです。
ファクトリ メソッド パターンは、次の場合に使用できます。
クラスは、必要なオブジェクトのクラスを知りません。ファクトリ メソッド パターンでは、クライアントは特定の製品クラスのクラス名を知る必要はありませんが、対応するファクトリだけを知っていればよく、特定の製品オブジェクトは特定のファクトリ クラスによって作成される; クライアントは、具体的な製品を作成するためにファクトリ クラスを知る必要があります。
クラスは、そのサブクラスを通じてどのオブジェクトを作成するかを指定します。 ファクトリ メソッド パターンでは、抽象ファクトリ クラスは製品を作成するためのインターフェイスを提供するだけでよく、そのサブクラスは、オブジェクト指向ポリモーフィズムを使用して、作成される特定のオブジェクトを決定します。置換原理 [3] により、プログラム実行時にサブクラス オブジェクトが親クラス オブジェクトをカバーするため、システムの拡張が容易になります。
オブジェクト作成のタスクを複数のファクトリ サブクラスのいずれかに委任します。これを使用する場合、クライアントはどのファクトリ サブクラスがプロダクト サブクラスを作成するかを気にする必要はありません。必要に応じて動的に指定できます。特定のファクトリ クラスのクラス名設定ファイルまたはデータベースに保存できます。
実現方法
ファクトリ メソッド パターンには次の役割が含まれます。
製品: 抽象製品 (
Operation
)ConcreteProduct: コンクリート製品 (
OperationAdd
)ファクトリ: 抽象ファクトリ (
IFactory
)ConcreteFactory: コンクリート工場 (
AddFactory
)
[ ][4]
こちらも電卓を使った例です。Operation
、、、などの複数のメソッドを変更しない場合は、単純なファクトリ パターン内のファクトリ クラス()を変更しOperationAdd
ます。元の「ユニバーサル」ビッグ ファクトリ クラスの代わりに、ファクトリ メソッドがここにあります。OperationDiv
OperationSub
OperationMul
OperationFactory
//工厂接口
public interface IFactory {
Operation CreateOption();
}
//加法类工厂
public class AddFactory implements IFactory {
public Operation CreateOption() {
return new OperationAdd();
}
}
//除法类工厂
public class DivFactory implements IFactory {
public Operation CreateOption() {
return new OperationDiv();
}
}
//除法类工厂
public class MulFactory implements IFactory {
public Operation CreateOption() {
return new OperationMul();
}
}
//减法类工厂
public class SubFactory implements IFactory {
public Operation CreateOption() {
return new OperationSub();
}
}
このように、クライアントで追加操作を実行したい場合は、次のメソッドが必要です。
public class Main {
public static void main(String[] args) {
IFactory factory = new AddFactory();
Operation operationAdd = factory.CreateOption();
operationAdd.setValue1(10);
operationAdd.setValue2(5);
System.out.println(operationAdd.getResult());
}
}
この時点で、ファクトリ メソッド パターンが書き込まれました。
コード サイズの観点から見ると、このファクトリ メソッド パターンは単純なファクトリ メソッド パターンよりも複雑です。さまざまな操作クラスに対応するファクトリがあります。多くの人が次のような疑問を抱いています。
ファクトリメソッドパターンは単純なファクトリパターンよりも複雑なようですか?
ファクトリ メソッド パターンは自分でオブジェクトを作成するのと変わりませんか? なぜさらに多くの工場を建設する必要があるのでしょうか?
上記の 2 つの質問に対するファクトリ メソッドのパターンを詳しく見てみましょう。
ファクトリメソッドパターンの長所と短所
オブジェクトの作成になぜファクトリーを使用するのでしょうか?
オブジェクト作成プロセスをカプセル化する
ファクトリ メソッド パターンでは、ファクトリ メソッドは顧客が必要とする製品を作成するために使用されますが、同時にどの特定の製品クラスがインスタンス化されるかについての詳細は顧客から隠蔽されます。ユーザーはファクトリが対応することだけを気にする必要があります。必要な製品にアクセスできるため、特定の製品クラスのクラス名さえわからなくても詳細を作成する必要がありません。
ファクトリの役割と製品の役割に基づいたポリモーフィックな設計が、ファクトリ メソッド パターンの鍵となります。**これにより、工場はどの製品オブジェクトを作成するかを独自に決定でき、このオブジェクトの作成方法の詳細は特定の工場内に完全にカプセル化されます。**ファクトリ メソッド パターンがポリモーフィック ファクトリ パターンとも呼ばれる理由は、すべての具象ファクトリ クラスが同じ抽象親クラスを持つためです。
各オブジェクトに個別のファクトリーがあるのはなぜですか?
「[オープン・クローズの原則][5]」を遵守する
主な目的はデカップリングです。システムに新しいプロダクトを追加する場合、抽象ファクトリと抽象プロダクト、クライアント、その他の特定のファクトリと特定のプロダクトが提供するインターフェイスを変更する必要はなく、特定のファクトリと特定のプロダクトを追加するだけで済みます。このようにして、システムの拡張性は非常に良好になり、「[開閉原則][3]」に完全に準拠します。
以上がファクトリーメソッドパターンのメリットです。ただし、ファクトリー パターンにもいくつか不十分な点があります。
新しいプロダクトを追加する場合、新しい特定のプロダクト クラスを作成し、対応する特定のファクトリ クラスを提供する必要があり、システム内のクラスの数がペアで増加するため、システムの複雑さがある程度増加します。クラスをコンパイルして実行する必要があるため、システムに追加のオーバーヘッドが発生します。
システムのスケーラビリティを考慮すると、抽象化層を導入する必要があります。これは、抽象化層を使用してクライアント コードで定義されます。これにより、システムの抽象化と理解が難しくなり、DOM、リフレクション、および DOM の使用が必要になる場合があります。実装中に他のテクノロジーが使用されるため、システム実装の難易度が増加します。
ファクトリーメソッドとシンプルファクトリーの違い
ファクトリ パターンは、単純なファクトリ パターンが [オープン-クローズ原則][3] に違反するという欠点を克服し、オブジェクト作成プロセスをカプセル化する利点を維持します。
これらはすべて、オブジェクトの作成を一元的にカプセル化しているため、オブジェクトを置き換える必要がある場合に大きな変更を加えることなく実現でき、クライアントと製品オブジェクトの間の結合が軽減されます。
要約する
ファクトリ メソッド パターンは、単純なファクトリ パターンをさらに抽象化し、推進したものです。
オブジェクト指向ポリモーフィズムの使用により、ファクトリ メソッド パターンは単純なファクトリ パターンの利点を維持し、その欠点を克服します。
ファクトリ メソッド パターンでは、コア ファクトリ クラスはすべての製品の作成を担当しなくなり、特定の作成作業はサブクラスに引き渡されます。このコア クラスは、特定のファクトリが実装する必要があるインターフェイスを提供することのみを担当し、インスタンス化される製品クラスの詳細には責任を負いません。これにより、ファクトリ メソッド パターンにより、システムはファクトリの役割を変更せずに新しい製品を導入できるようになります。
ファクトリ メソッド パターンの主な利点は、新しい製品カテゴリを追加するときに既存のシステムを変更する必要がなく、製品オブジェクトの作成の詳細がカプセル化されることです。このシステムには優れた柔軟性と拡張性があります。欠点は、次のことを行う必要があることです。新しい製品を追加しながら、工場ではシステム クラスの数がペアで増加し、システムの複雑さがある程度増加しました。