創造パターン - 抽象的な工場パターンの理解

目次

1 はじめに:

2. 抽象的なファクトリーデモの最適化

2.1 シナリオの説明

2.2 抽象ファクトリーの実装

3. メリットとデメリット


1 はじめに:

前回の記事はクリエーションモード・ファクトリーメソッドモード・デモの理解について書きました。

ファクトリ メソッド パターンの欠点の 1 つは、新しいサブクラスが増えると、作成される Java クラスの数がさらに増えることです。

この欠点を最適化する方法は、抽象ファクトリ パターンを使用して最適化することができます。

前提条件は、サブカテゴリの全量を一度に拡張しようとすることですが、これは後のメンテナンスに不便です。

簡単なポイントは、すべての指標が決定されたときに、対応するさまざまな指標計算 API のセットを共通のクラスに作成することです。

2. 抽象的なファクトリーデモの最適化

2.1 シナリオの説明

ブログを引用するには:

ファクトリ メソッド パターンでは、特定のファクトリが特定の製品の生産を担当します。特定の各ファクトリは特定の製品に対応します。ファクトリ メソッドは一意です。通常、特定のファクトリには 1 つまたは多重定義されたファクトリ メソッドのグループのみが存在します。しかし、場合によっては、工場が単一の製品オブジェクトではなく複数の製品オブジェクトを提供できることを期待します。たとえば、電化製品工場では、特定の種類の電化製品だけを生産するのではなく、テレビ、冷蔵庫、エアコン、その他の電化製品を生産できます。抽象的なファクトリ パターンをよりよく理解するために、まず 2 つの概念を紹介します。

       (1) 製品レベルの構造: 製品レベルの構造は、製品の継承構造です。たとえば、抽象クラスが TV で、そのサブクラスにハイアール TV、ハイセンス TV、TCL TV が含まれる場合、抽象テレビと特定のブランドのテレビ それらの間には製品階層構造が形成され、抽象的なテレビが親カテゴリ、特定のブランドのテレビがそのサブカテゴリになります。

       (2) 製品ファミリー: 抽象的な工場モデルでは、製品ファミリーとは、同じ工場で生産され、異なる製品階層構造に位置する製品のグループを指します (ハイアール テレビ、ハイアール冷蔵庫、ハイアール電気工場が製造するハイアール テレビなど)。テレビはテレビ製品の階層構造に位置し、ハイアール冷蔵庫は冷蔵庫の階層構造に位置し、ハイアール テレビとハイアール冷蔵庫は製品ファミリーを構成します。

       製品レベルの構造と製品ファミリーの概略図を次の図に示します。

異なる色の複数の正方形、円、楕円は 3 つの異なる製品階層構造を形成し、同じ色の正方形、円、楕円は製品ファミリーを形成し、各形状オブジェクトは製品ファミリーに属し、製品階層に属します。図 3 には 5 つの製品ファミリーがあり、3 つの異なる製品階層構造に属しています。製品を一意に識別するには、その製品が属する製品ファミリーとその階層構造を指定するだけです。

       抽象工場パターンは、システムが提供する工場で生産される特定の製品が単純なオブジェクトではなく、異なる製品階層構造に位置し、異なるタイプに属する複数の特定の製品である場合に使用できます。抽象ファクトリ パターンは、すべてのファクトリ パターンの中で最も抽象的で一般的な形式です。抽象ファクトリ パターンとファクトリ メソッド パターンの最大の違いは、ファクトリ メソッド パターンが製品階層構造を対象としているのに対し、抽象ファクトリ パターンは複数の製品階層構造に直面する必要があり、ファクトリ階層構造は複数の製品階層構造を担当できることです。さまざまな製品階層構造 製品オブジェクトの作成 ファクトリ階層が、異なる製品階層に属する製品ファミリ内のすべてのオブジェクトを作成できる場合、抽象ファクトリ パターンはファクトリ メソッド パターンよりも単純で効率的です。抽象ファクトリ パターンの概略図を図 4 に示します。
 

特定の各工場は、同じ色の正方形、円、楕円形の生産など、製品ファミリーに属するすべての製品を生産でき、生産された製品は異なる製品階層構造に配置されます。ファクトリ メソッド パターンを使用する場合、図 4 に示す構造では 15 個の具象ファクトリを提供する必要がありますが、抽象ファクトリ パターンでは 5 個の具象ファクトリを提供するだけで済み、システム内のクラスの数が大幅に削減されます。

2.2 抽象ファクトリーの実装

抽象的なファクトリ パターン構造図には、次の役割が含まれています。

       ● AbstractFactory (抽象ファクトリー): 製品ファミリーを作成するために使用されるメソッドのセットを宣言します。各メソッドは製品に対応します。

       ● ConcreteFactory (コンクリートファクトリ): 抽象ファクトリで宣言されたプロダクトの作成メソッドを実装し、特定のプロダクトのグループを生成し、これらのプロダクトがプロダクトファミリーを形成し、各プロダクトがプロダクト階層に配置されます。

       ● AbstractProduct(抽象プロダクト):プロダクトごとのインターフェースを宣言し、抽象プロダクト内でプロダクトのビジネスメソッドを宣言します。

       ● ConcreteProduct (具体的な製品): 特定の工場で生産される特定の製品オブジェクトを定義し、抽象的な製品インターフェイスで宣言されたビジネス メソッドを実現します。

       複数のファクトリ メソッドが抽象ファクトリで宣言され、さまざまなタイプの製品が作成されます。抽象ファクトリには、インターフェイス、抽象クラス、具象クラスを使用できます。一般的なコードは次のとおりです。
 

abstract class AbstractFactory {
public abstract AbstractProductA createProductA(); //工厂方法一
public abstract AbstractProductB createProductB(); //工厂方法二
……
}

具体工厂实现了抽象工厂,每一个具体的工厂方法可以返回一个特定的产品对象,而同一个具体工厂所创建的产品对象构成了一个产品族。对于每一个具体工厂类,其典型代码如下所示:

class ConcreteFactory1 extends AbstractFactory {
    //工厂方法一
public AbstractProductA createProductA() {
    return new ConcreteProductA1();
}
 
//工厂方法二
public AbstractProductB createProductB() {
    return new ConcreteProductB1();
}
 
……
}

3. メリットとデメリット

簡単に言うと、ファクトリーメソッドのパターンを最適化することができます。

 しかし、後から新しい製品レベルの構造を追加するのが面倒であれば、元のシステムを大幅に変更する必要があり、さらには抽象化層のコードも変更する必要があり、明らかに不便であり、「オープンとクローズ」に違反します。原理"。


 

おすすめ

転載: blog.csdn.net/qq_44691484/article/details/130528314