package GOF;
interface Create {
public void create();
}
class A implements Create {
@Override
public void create() {
System.out.println("A");
}
}
class B implements Create {
@Override
public void create() {
System.out.println("B");
}
}
interface Produce {
public Create produce();
}
class C implements Produce {
@Override
public Create produce() {
return new A();
}
}
class D implements Produce {
@Override
public Create produce() {
return new B();
}
}
public class AbstractFactory {
public static void main(String[] args) {
Produce produce = new C();
Create create = produce.produce();
create.create();
}
}
如上图所示代码,是抽象工厂模式的实例。请问在实际的业务场景中如何使用?有什么优点。
大家讲道理2017-04-18 09:29:40
あなたの質問は非常に意味のあるものだと思います。多くの人はデザインパターンを柔軟に適用することができません。
問題分析の観点から、なぜファクトリークラスのデザインパターンを使用する必要があるのかについてお話します
質問 1: に似た関数 を持つクラスがよくあります。そのため、私たちのアイデアは、それらを抽象化し、インターフェイスを使用してパブリック メソッドを公開し、抽象クラスを使用して パブリック の実現を提供することです。 。
リーリー2 番目の質問: 同様の関数を持つこれらのクラスのインスタンス化が問題になります。各クラスのコンストラクターのパラメーターが異なるため、毎回オブジェクトを新規作成するのは面倒なので、単純なファクトリーにカプセル化されます。パターン。
リーリー3 番目の質問: 単純なファクトリ モデルは拡張に適しておらず、開始と終了の原則に違反します。クラスが追加されるたびに、ファクトリ クラスを変更する必要があります (ファクトリ クラスとビジネスクラスは 2 つの小さいものです (パートナーが別々に作成すれば、通信にそれほど時間はかかりません...) そこで、ファクトリ メソッド パターン があり、その原理は単純なものを抽象化することです工場。
リーリー質問 4: 突然悪い点に気づきました。類似した機能を持つ製品の抽象化を 3 層にし、各製品のファクトリ クラスも 2 層抽象化したため、コードが膨大になってしまいました。しかし、特定のビジネス シナリオでは、単にクラスをインスタンス化するだけではありません。たとえば、ゲームで兵士に装備を装備させたい場合は、まず銃器を装備する必要があります (ライフル、スナイパーライフルなど、多くの銃器があります。抽象化には質問 1 を使用してください)。しかし、銃器を装備した後、弾丸も装備する必要があります (抽象化には引き続き質問 1 の方法を使用します)。これで、現在の状況に基づいて 2 層のファクトリー クラスを抽象化できます。銃器と弾丸の両方を生産する工場はありますか? これは抽象ファクトリー パターンです。簡単に言うと、 いくつかの関連製品や類似の製品を 1 つの工場にまとめて生産することができ、別の工場を開く必要はありません 。
また、私を訂正するために、あなたが投稿したコードはファクトリメソッドパターンであり、抽象ファクトリパターンではありません。
質問者が私の答えを受け入れていないのを見て、もう少し言葉をかけて、具体的な応用例を挙げます。
Java のジェネリックスが型消去を使用して実装されていることは誰もが知っています (ジェネリックスは javac のコンパイル プロセス中に削除され、強制的な型変換が追加されます)。したがって、 new T() を使用してオブジェクトを直接インスタンス化することはできません。実際、この問題は Factory Method Pattern 設計パターンを使用することで解決できます。
ジェネリックインスタンス化を使用するクラスがあるとします。
リーリーファクトリーインターフェースを次のように与えます:
リーリー次の方法を使用して改善できます
リーリー現時点では、次の方法で Foo をインスタンス化できます
リーリーps: 冗長になりすぎないように、ここではファクトリ メソッドの実装は内部クラスを使用して行われます。