シンプル ファクトリ パターン: 静的ファクトリ メソッド パターンとも呼ばれます。
簡易ファクトリーパターンはGOFの23デザインパターンには含まれません。
ただし、Yan Hon の「Java とパターン」には、Simple Factory パターンの定義が記載されています。
ファクトリーパターンの形です。
1.目的: 単純なファクトリ パターンは、受信パラメータに基づいてどの製品クラス インスタンスを作成するかを決定するファクトリ クラスを持つことです。
2.参加者:
抽象プロダクト (Product):ファクトリ クラスの静的ファクトリ メソッド createProdcut() によって作成されるオブジェクトのインターフェイスを定義します。
具体的な製品:抽象的な製品のインターフェイスを実装します。
ファクトリ クラス (Creator):特定の製品インスタンスを返す静的ファクトリ メソッド createProdcut() を定義します。
3.構造:
次のように、実際の例を使用して、単純なファクトリ パターンの定義をマップします。
一汽フォルクスワーゲン(工場部門)は、アウディ A6(具体的な製品)と呼ばれる自動車(抽象的な製品)を生産しました。
実際、初心者のための Java デザイン パターン - ファクトリ パターンに関する前回の記事では、例 1 と 4 は単純なファクトリ パターンであるはずです。それは、ファクトリ メソッドには受信パラメータがないため、必要に応じて異なる製品を動的に作成できないというだけであり、静的なファクトリ メソッドは 1 つの製品インスタンスのみを返すことができます。
一汽フォルクスワーゲン(工場型)が2 台の車(抽象製品)を生産する場合、 1 台はAudi A6 (具体的な製品)、もう 1 台はAudi A8 (具体的な製品) と呼ばれます。
Javaコードで実装するにはどうすればよいでしょうか? 例 6 は次のとおりです。
車 (抽象的な製品の役割):
/*
* 无论哪个款汽车,都是汽车 (抽象产品类)
*/
public abstract class Car {
public String name;
}
Audi A6 (特定の製品の役割):
/*
* 奥迪A6,是一汽大众生产的一款汽车 (具体产品类)
*/
public class AudiA6Car extends Car {
public AudiA6Car(){
this.name = "奥迪A6";
}
public String toString(){
return "一辆"+ this.name;
}
}
Audi A8 (特定の製品の役割):
/*
* 奥迪A8,是一汽大众生产的一款汽车 (具体产品类)
*/
public class AudiA8Car extends Car {
public AudiA8Car(){
this.name = "奥迪A8";
}
public String toString(){
return "一辆"+ this.name;
}
}
一汽フォルクスワーゲン (工場の役割):
ファクトリ メソッドでは、顧客が購入したい車を決定するために受信パラメータが必要です。
/*
* 生产汽车的工厂,一汽大众 (工厂类)
*/
public class CarFactory {
/*
* 生产汽车(通过一个静态方法来得到一辆汽车的对象)
*/
public static Car manufactureCar(String carName){
Car car = null;
if(carName.equals("audiA6")){
return new AudiA6Car();
}else if(carName.equals("audiA8")){
return new AudiA8Car();
}
return null;
}
}
コードのクラス構造は次のとおりです。
クライアントの呼び出し:
顧客 A (クライアント) は Audi A6 の購入を希望し、顧客 B (クライアント) は Audi A8 の購入を希望しています。
/*
* 购买奥迪的顾客(客户端)
*/
public class Customers {
public static void main(String[] args){
System.out.println("===========顾客A买奥迪A6===========");
// 顾客A想买一辆奥迪A6,那么工厂需要生产奥迪A6
Car myCarA6 = CarFactory.manufactureCar("audiA6");
System.out.println("奥迪A6被造好,并且出厂了。");
// 顾客A得到了他想要的汽车
System.out.println("我终于买了"+myCarA6+"。真是太好了!");
System.out.println("===========顾客B买奥迪A8===========");
// 顾客B想买一辆奥迪A8,那么工厂需要生产奥迪A8
Car myCarA8 = CarFactory.manufactureCar("audiA8");
System.out.println("奥迪A8被造好,并且出厂了。");
// 顾客B得到了他想要的汽车
System.out.println("我终于买了"+myCarA8+"。真是太好了!");
}
}
操作結果:
===========顾客A买奥迪A6===========
奥迪A6被造好,并且出厂了。
我终于买了一辆奥迪A6。真是太好了!
===========顾客B买奥迪A8===========
奥迪A8被造好,并且出厂了。
我终于买了一辆奥迪A8。真是太好了!
シンプルなファクトリーパターンの利点:
1. ファクトリクラスは静的ファクトリメソッドを使用しているため、ファクトリクラスのインスタンス(オブジェクト)を作成する必要がなく、外部からファクトリクラスの静的メソッドを直接呼び出して、ファクトリクラスのインスタンス(オブジェクト)を取得できます。特定の製品。
2. ファクトリ クラスには、外部から与えられた情報に基づいてオブジェクトのどの特定のクラスを作成するかを決定するために必要な論理的判断が含まれています。つまり、クライアントのさまざまなニーズに対応し、製品クラス (これらの製品クラスは親クラスまたはインターフェイスから継承する) のどのインスタンス (オブジェクト) を作成して返すかを動的に決定できます。
単純なファクトリー・パターンの欠点:
1. 新しい製品が必要な場合、新しい特定の製品カテゴリを追加するだけで済みますが (他のお茶カテゴリを変更する必要はありません)、ファクトリ クラスには新しい製品を提供するロジックがありません。ソース コードを変更して、システムが再コンパイルされました。これは「開閉原則」に違反します。
例:上記の例 6では、新しい特定の製品クラス AudiA9Car が追加された場合、既存のファクトリー クラス CarFactory コードも変更して再コンパイルする必要があります。これにより、予期しないエラーが発生し、既存のシステムの安定性に影響を与える可能性があります。
2. ファクトリ メソッドは静的メソッドを使用しており、静的メソッドはサブクラスに継承できないため、ファクトリ ロールは継承に基づく階層構造を形成できません。
3. プロダクト クラスに異なるインターフェイス タイプがある場合、ファクトリ クラスはどのプロダクトをいつ作成するかを決定する必要があり、このロジックでは、タイミングの判断と特定のプロダクトの判断が混在します。これは、高度な結束力の責任配分の原則に違反しており、システムの維持と拡張に非常に有害です。
例:自動車工場の発展に伴い、1 つのスタイルの車を生産するだけでなく、各スタイルの車の異なるモデルも生産するようになります。工場が 1 つしかない場合、生産ニーズに応えられず、過負荷が生じ、設備の老朽化などのトラブルが発生しやすくなります。また、ある自動車の生産設備にトラブルが発生すると、他の車種の生産にも影響を及ぼす可能性があります。
単純なファクトリーパターンのこれらの欠点はどのように解決されるべきでしょうか? 次の記事:初心者のためのJavaデザインパターンの注意点 - ファクトリメソッド(ファクトリーパターン)パターン