記事ディレクトリ
クリエイティブパターン-ファクトリメソッドパターン
1.定義
ファクトリメソッドパターンは、親クラスにオブジェクトを作成するメソッドを提供する作成デザインパターンであり、サブクラスがインスタンス化されたオブジェクトのタイプを判別できるようにします。
第二に、問題
企業の急行輸送は、当初は陸上での輸送のみであり、その後、人員や需要の増加に伴い、海外への輸送が必要となるため、海上輸送の数を増やすと、次に、プログラムのコードに大幅な変更を加える必要があります。これは明らかにオープンクローズの原則に準拠していません。
3.ソリューション
ファクトリメソッドパターンは、この問題の優れた解決策です。オブジェクトコンストラクター(新しいオブジェクト)を直接呼び出す代わりに、特別なファクトリメソッドを使用します。
4.実現
1.製品
はインターフェースを宣言します。これらのインターフェースは、作成者とそのサブクラスによって構築されたすべてのオブジェクトに共通です。
package com.atmae.factory;
/**
* @Author: Mae
* @Date: 2022/4/6
* @Time: 19:49
* @Description:
*/
public interface Product {
void deliver();
}
2.特定の製品
は、製品インターフェースの異なる実現です。
トラック:
package com.atmae.factory;
/**
* @Author: Mae
* @Date: 2022/4/6
* @Time: 19:49
* @Description:
*/
public class Truck implements Product{
@Override
public void deliver() {
System.out.println("使用卡车在陆地运输");
}
}
船:
package com.atmae.factory;
/**
* @Author: Mae
* @Date: 2022/4/6
* @Time: 19:48
* @Description:
*/
public class Ship implements Product{
@Override
public void deliver() {
System.out.println("使用轮船在海上运输");
}
}
3.ファクトリ
クラスを作成して、製品オブジェクトを返すファクトリメソッドを宣言します。メソッドの戻りオブジェクトタイプは、製品インターフェイスと一致する必要があります。
package com.atmae.factory;
/**
* @Author: Mae
* @Date: 2022/4/6
* @Time: 19:47
* @Description:
*/
public abstract class Factory {
public abstract Product createProduct();
}
4.特定のファクトリクラス
基本ファクトリメソッドは、別のタイプの製品を返すためにオーバーライドされます。
パッケージcom.atmae.factory;
/**
* @Author: Mae
* @Date: 2022/4/6
* @Time: 19:48
* @Description:
*/
public class ShipFactory extends Factory{
@Override
public Product createProduct() {
return new Ship();
}
}
package com.atmae.factory;
/**
* @Author: Mae
* @Date: 2022/4/6
* @Time: 19:48
* @Description:
*/
public class TruckFactory extends Factory{
@Override
public Product createProduct() {
return new Truck();
}
}
5.クライアント
クライアントは抽象クラスを使用して、具象ファクトリ(ポリモーフィズム)を実装するためのファクトリを作成するだけでよく、具象ファクトリは製品タイプを返します。
package com.atmae.factory;
/**
* @Author: Mae
* @Date: 2022/4/6
* @Time: 19:48
* @Description:
*/
public class Client {
public static void main(String[] args) {
Factory factory=new ShipFactory();
Product product = factory.createProduct();
product.deliver();
}
}
5、UML図
第六に、ファクトリメソッドパターンはシーンに適しています
- コードを作成する過程で、オブジェクトの正確なクラスとその依存関係を予測できない場合は、ファクトリメソッドを使用できます。
- 既存のオブジェクトを再利用してシステムリソースを節約する場合は、オブジェクトを毎回再作成する代わりに、ファクトリメソッドを使用できます。
- ユーザーにソフトウェアライブラリまたはフレームワークの内部コンポーネントを拡張してもらいたい場合は、ファクトリメソッドを使用できます
7.まとめ
アドバンテージ
- 単一責任の原則。製品作成コードをプログラム内の1つの場所に配置して、コードの保守を容易にすることができます。
- オープンクローズド原則。既存のクライアントコードを変更せずに、新しい製品タイプをプログラムに導入できます。
- 工場とコンクリート製品の緊密な結合を回避できます。
欠点
- 多くの新しいサブクラスが導入され、その結果、コードがより複雑になる可能性があります
8.他のモードとの比較
- SimpleFactory
の場合SimpleFactoryは、すべての製品が1つのファクトリによって管理されるのに対し、Factory Methodは、各製品が異なるファクトリによって管理される場所であり、すべてが抽象ファクトリクラスから継承されます。
ファクトリメソッドは、単純なファクトリの内部ロジックをクライアントに移動します。クライアントを変更する機能の追加は、ファクトリクラスではなくなりました。