抽象的な工場設計パターン

Susan Sarandon
Susan Sarandonオリジナル
2024-10-05 16:22:29963ブラウズ

抽象ファクトリ メソッド デザイン パターン :- 基本的に、これはパターン内のパターンであり、ファクトリ デザインの方法で類似したオブジェクトのファミリーに属するオブジェクトを作成するために必要な創造的なデザイン パターンです。類似したタイプのオブジェクトを作成したパターン ここでは、ファクトリのファクトリを使用して、類似したオブジェクトのファミリーに属するオブジェクトを作成しています。

ファクトリ設計パターンと抽象ファクトリ設計パターンの違い

Abstract Factory Design Pattern

Abstract Factory Design Pattern

抽象ファクトリー パターンは、ファクトリー メソッド パターンに似ていますが、レイヤーが 1 つ追加されています。 Abstract Factory には、関連オブジェクト (ボタンやチェックボックスなど) のグループを作成するメソッドを定義する中央インターフェイス (または「ファクトリー」) があります。

各 Concrete Factory クラスは、実際のオブジェクトの作成にどの特定のファクトリ (たとえば、Windows または Mac 用のファクトリ) を使用するかを決定します。最終的なオブジェクト (Mac ボタンや Windows チェックボックスなど) を作成するロジックは、これらの Concrete Product クラスに実装されます。

簡単に言うと:

  1. Abstract Factory は、オブジェクトのファミリーを作成するメソッドを定義します。
  2. コンクリート工場は、何らかのロジックに基づいて、どの特定の工場を使用するかを決定します。
  3. これらの工場のロジックに基づいて、具体的な製品(現物)が作られます。

このパターンは、コードを特定の実装に緊密に結合することなく、関連オブジェクトを作成するのに役立ちます。

抽象ファクトリー設計パターンのクラス図


        +----------------------+
        |   AbstractFactory     | <------------------------------+
        |---------------------- |                                  |
        | + createProductA()    |                                  |
        | + createProductB()    |                                  |
        +----------------------+                                   |
                  ^                                                |
                  |                                                |
   +-------------------------+             +-------------------------+
   |     ConcreteFactory1     |             |     ConcreteFactory2     |
   |------------------------- |             |-------------------------|
   | + createProductA()       |             | + createProductA()       |
   | + createProductB()       |             | + createProductB()       |
   +-------------------------+             +-------------------------+
            |                                       |
            |                                       |
    +---------------+                      +---------------+
    |   ProductA1   |                      |   ProductA2   |
    +---------------+                      +---------------+
    +---------------+                      +---------------+
    |   ProductB1   |                      |   ProductB2   |
    +---------------+                      +---------------+



抽象的な工場設計パターンを理解するためのアナロジー: スマートフォン メーカー

Android と iPhone という 2 つの製品ラインを提供するスマートフォン会社を想像してください。どちらのラインにも電話機と充電器が含まれていますが、各ラインの特定のモデルは異なります。

あるスマートフォン会社は、Android と iPhone の 2 つの製品ラインを製造しており、それぞれに電話機と充電器があります。

  • 抽象ファクトリー: どの製品 (電話と充電器) を作成する必要があるかを定義する青写真と考えてください。
  • コンクリート工場: Android 部門や iPhone 部門のようなもので、選択したライン (Android または iPhone) に基づいて特定の製品を作成する責任があります。
  • 具体的な製品: 各部門が製造した実際のアイテム (Android Phone、Android 充電器、iPhone、iPhone 充電器)。
  • クライアント: 顧客は Android か iPhone のどちらかを選択すると、その製造方法を知らなくても適切な製品が作成されます。 このパターンにより、内部作成ロジックを公開することなく、互換性のある製品 (電話と充電器) が一緒に作成されます。

以下は上記の類似の UML 図です


                 +--------------------+
                 |   AbstractFactory   |  <--- Abstract Interface for creating products
                 +--------------------+
                 | + createPhone()     |
                 | + createCharger()   |
                 +--------------------+
                          /\
                          ||
        +-------------------------------------------+
        |                                           |
+----------------------+                  +----------------------+
|  AndroidFactory      |                  |  iPhoneFactory       |  <-- Concrete Factories
+----------------------+                  +----------------------+
| + createPhone()      |                  | + createPhone()      |
| + createCharger()    |                  | + createCharger()    |
+----------------------+                  +----------------------+
        /\                                      /\
        ||                                      ||
+-------------------+                +-------------------+
| AndroidPhone      |                | iPhone            |  <-- Concrete Products
+-------------------+                +-------------------+
| + makeCall()      |                | + makeCall()      |
+-------------------+                +-------------------+
+-------------------+                +-------------------+
| AndroidCharger    |                | iPhoneCharger     |  <-- Concrete Products
+-------------------+                +-------------------+
| + charge()        |                | + charge()        |
+-------------------+                +-------------------+

Client
+----------------------------------+                <-- Client Code
| Calls either AndroidFactory or   |
| iPhoneFactory to get products    |
+----------------------------------+



上記の類似点をよりわかりやすく理解するためのコードを次に示します


// Abstract Factory
class AbstractFactory {
  createPhone() {
    throw new Error('This method should be overridden');
  }

  createCharger() {
    throw new Error('This method should be overridden');
  }
}

// Concrete Factory for Android
class AndroidFactory extends AbstractFactory {
  createPhone() {
    return new AndroidPhone();
  }

  createCharger() {
    return new AndroidCharger();
  }
}

// Concrete Factory for iPhone
class iPhoneFactory extends AbstractFactory {
  createPhone() {
    return new iPhone();
  }

  createCharger() {
    return new iPhoneCharger();
  }
}

// Product classes for Android
class AndroidPhone {
  makeCall() {
    return 'Making a call from Android Phone';
  }
}

class AndroidCharger {
  charge() {
    return 'Charging Android Phone';
  }
}

// Product classes for iPhone
class iPhone {
  makeCall() {
    return 'Making a call from iPhone';
  }
}

class iPhoneCharger {
  charge() {
    return 'Charging iPhone';
  }
}

// Client code
function getFactory(osType) {
  switch (osType) {
    case 'Android':
      return new AndroidFactory();
    case 'iPhone':
      return new iPhoneFactory();
    default:
      throw new Error('Unknown OS type');
  }
}

// Example usage
const androidFactory = getFactory('Android');
const androidPhone = androidFactory.createPhone();
const androidCharger = androidFactory.createCharger();

console.log(androidPhone.makeCall());  // Output: Making a call from Android Phone
console.log(androidCharger.charge());  // Output: Charging Android Phone

const iphoneFactory = getFactory('iPhone');
const iphone = iphoneFactory.createPhone();
const iphoneCharger = iphoneFactory.createCharger();

console.log(iphone.makeCall());        // Output: Making a call from iPhone
console.log(iphoneCharger.charge());   // Output: Charging iPhone



Abstract Factory パターンは、正確なクラスを指定せずに関連オブジェクトのファミリーの作成を促進する強力な設計アプローチです。実際の製品作成からクライアント コードを切り離すことで、新しい製品ファミリーを導入する際の柔軟性、拡張性、およびよりクリーンなコード管理が確保されます。クロスプラットフォーム インターフェイスの管理であれ、さまざまな製品ラインの作成であれ、このパターンは、オブジェクト作成の複雑さを処理するための構造化された保守可能なソリューションを提供します。 Abstract Factory を実装すると、コードの将来性を保証し、システムが進化しても懸念事項を明確に分離し続けることができます。

これらのアイデアを自分の作品にどのように適用したのか聞きたいです。以下のコメント欄でご意見やご質問をお聞かせください。ぜひご意見をお待ちしております。

この学習の旅にご参加いただきありがとうございます!

以上が抽象的な工場設計パターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。