今日は、非常に広く使用されている強力なファクトリパターンであるデザインパターンについて学びます。主なコアは、特定の種類のプログラミングではなく、抽象的にプログラミングすることです。
問題から始める
- 単純な工場とは何ですか?デザイン柄ですか?使うなら?
- ファクトリーメソッドとは何ですか?抽象とは何ですか?
- 抽象ファクトリーとは何ですか?抽象とは何ですか?
- ファクトリーメソッドと抽象ファクトリーの違いは?
単純なファクトリパターン
単純なファクトリーは、実際の設計パターンとは見なされませんが、私たちのプログラミング習慣に似ていますが、通常のコーディングで特定のクラスからクライアントプログラムを分離する簡単な方法です。
前書き
ファクトリー・クラスには、パラメーターを受け入れ、さまざまなパラメーターを通じてさまざまな製品クラスをインスタンス化するファクトリー・メソッド(作成)があります。
アイコン:
長所と短所
- 利点:
- 言うまでもなく、単純なファクトリーの特徴は「単純で失礼」であり、パラメーターを含むファクトリーメソッドを使用して、飛行機やロケットからポテトヌードルまで、あらゆる製品カテゴリーをインスタンス化できます。
- したがって、単純なファクトリーにはエイリアスがあります:Godクラス。
- 短所:
- 「もの」のサブカテゴリはどれも作成できますが、これは重すぎます。生産する製品の種類が多い場合、ファクトリーメソッドのコードは膨大になる可能性があります。
- 開閉の原則(拡張のために開く、変更のために閉じる)に従うという条件下では、シンプルファクトリーは新しい製品を追加することができません。なぜなら、新製品の追加は、ファクトリーメソッドを変更することによってのみ達成できるからです。
ファクトリメソッドは、単純なファクトリのこれら2つの欠点を解決するだけです。このような進歩的な学習を通して、あなたは間違いなくそれを完全に理解するでしょう。
ヒント:Springは、構成ファイルとリフレクションを通じて単純なファクトリーの欠点を解決します。
使い方
public class AnimalFactory {
//简单工厂设计模式(负担太重、不符合开闭原则)
public static Animal createAnimal(String name) {
if ("cat".equals(name)) {
return new Cat();
} else if ("dog".equals(name)) {
return new Dog();
} else if ("cow".equals(name)) {
return new Dog();
} else {
return null;
}
}
}
工場法
オブジェクトを作成するためのインターフェースが定義されていますが、サブクラスはインスタンス化するクラスを決定します。ファクトリメソッドは、クラスのインスタンス化をサブクラスに委任します。
アイコン
長所と短所
- 利点
- ファクトリー・メソッド・パターンは、ファクトリー・クラスの負担を軽減し、特定のタイプ/モノを生産のためにファクトリーに引き渡すのに適した方法です(単純なファクトリー1の欠点に対応)。
- 同時に、特定のタイプの「もの」を追加する場合、ファクトリクラスを変更する必要はありません。このタイプの「もの」を生成するファクトリを追加するだけで、ファクトリクラスは開閉の原則に準拠します。
- 不利益
- 製品ファミリ(製品のグループ)を形成する可能性がある特定の状況に対処することは、より複雑です。
例
// 抽象出来的动物工厂----它只负责生产一种产品
public abstract class AnimalFactory {
// 工厂方法
public abstract Animal createAnimal();
}
// 具体的工厂实现类
public class CatFactory extends AnimalFactory {
@Override public Animal createAnimal() {
return new Cat();
}
}
//具体的工厂实现类
public class DogFactory extends AnimalFactory {
@Override public Animal createAnimal() {
return new Dog();
}
}
抽象的なファクトリパターン
特定のクラスを指定する必要なしに、関連オブジェクトまたは依存オブジェクトのファミリを作成するためのインターフェースを提供します。
たとえば、自動車は、自動車、SUV、MPVなどだけでなく、メルセデスベンツ、BMWなどに分類できます。メルセデス・ベンツのすべての車を1つの製品ファミリーと見なし、BMWのすべての車を別の製品ファミリーと見なすことができます。2つの工場に対応して、1つはメルセデス・ベンツ工場であり、もう1つはBMW工場です。工法とは異なり、メルセデスベンツの工場では、特定の製品だけでなく、一連の製品(メルセデスベンツセダン、メルセデスベンツSUV、メルセデスベンツMPV)も生産しています。「抽象工場」の「抽象化」とはこれを指します。つまり、ファクトリメソッドと比較して、抽象ファクトリは製品ではなく一連の製品を定義します。
上記のファクトリー・メソッド・パターンは極端な抽象ファクトリー・パターン(つまり、1つの製品のみを生成する抽象ファクトリー・パターン)であり、抽象ファクトリー・パターンはファクトリー・メソッド・パターンのプロモーションと見なすことができます。
アイコン
ファクトリーモードの違い
- 単純なファクトリー:ファクトリー・オブジェクトを使用して、同じ階層構造で任意の製品を作成します。(製品を増やすための拡張はサポートしていません)
- ファクトリー・メソッド:複数のファクトリー・オブジェクトを使用して、対応する固定製品を同じ階層構造で作成します。(商品の拡大・拡大支援)
- 抽象ファクトリ:複数のファクトリオブジェクトを使用して、異なる製品ファミリのすべての製品を生成します。(製品の拡張と追加はサポートしていません。製品ファミリの追加はサポートしています)
今日新しく学習したオブジェクト指向の原則:抽象化に依存し、具体的なクラスに依存しない