ファクトリおよびファクトリ メソッドの設計パターンを理解する

Mary-Kate Olsen
リリース: 2024-11-05 15:01:02
オリジナル
309 人が閲覧しました

Understanding the Factory and Factory Method Design Patterns

ファクトリークラスとは何ですか?ファクトリ クラスは、異なるクラスの 1 つ以上のオブジェクトを作成するクラスです。

Factory パターンはおそらくソフトウェア エンジニアリングで最もよく使用される設計パターンです。この記事では、シンプルなファクトリとファクトリ メソッドのデザイン パターンについて、簡単な問題例を使用して詳しく説明します。

シンプルなファクトリーパターン

犬と猫といった 2 種類の動物をサポートするシステムを作成するとします。それぞれの動物クラスには、動物の種類に応じた鳴き声を発するメソッドが必要です。ここで、クライアントはシステムを使用して、クライアントのユーザー入力に基づいて動物の鳴き声を出したいと考えています。上記の問題に対する基本的な解決策は次のように記述できます:

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def make_sound(self):
        pass

class Dog(Animal):
    def make_sound(self):
        print("Bhow Bhow!")

class Cat(Animal):
    def make_sound(self):
        print("Meow Meow!")
ログイン後にコピー
ログイン後にコピー

このソリューションでは、クライアントは次のようにシステムを活用します

## client code
if __name__ == '__main__':
    animal_type = input("Which animal should make sound Dog or Cat?")
    if animal_type.lower() == 'dog':
        Dog().make_sound()
    elif animal_type.lower() == 'cat':
        Cat().make_sound()
ログイン後にコピー
ログイン後にコピー

私たちのソリューションは問題なく機能しますが、Simple Factory Pattern はもっと改善できると言っています。なぜ?上記のクライアント コードでわかるように、クライアントは一度にどの動物クラスを呼び出すかを決定する必要があります。たとえば、システムに 10 種類の異なる動物クラスがあると想像してください。私たちのクライアントにとってこのシステムを使用することがいかに問題があるかはすでにおわかりでしょう。

ここでの Simple Factory パターンは、どのクラスを呼び出すかをクライアントに決定させる代わりに、クライアントに代わってシステムに決定させようと言っているだけです。

Simple Factory パターンを使用して問題を解決するには、動物オブジェクトの作成を処理するメソッドを備えたファクトリ クラスを作成するだけです。

...
...
class AnimalFactory:
    def make_sound(self, animal_type):
        return eval(animal_type.title())().make_sound()
ログイン後にコピー
ログイン後にコピー

このアプローチでは、クライアント コードは次のようになります。

## client code
if __name__ == '__main__':
    animal_type = input("Which animal should make sound Dog or Cat?")
    AnimalFactory().make_sound(animal_type)
ログイン後にコピー
ログイン後にコピー

要約すると、Simple Factory パターンは、クライアントに代わってオブジェクトの作成を処理するファクトリ クラスを作成することを目的としています。

ファクトリメソッドパターン

システムが 2 種類の動物 (犬と猫) のみをサポートするという問題の説明に戻りますが、この制限がなくなり、システムがあらゆる種類の動物をサポートできるようになったらどうなるでしょうか?もちろん、私たちのシステムには何百万もの動物に実装を提供する余裕はありませんでした。ここで、ファクトリー メソッド パターンが役に立ちます。

ファクトリ メソッド パターンでは、オブジェクトを作成するための抽象クラスまたはインターフェイスを定義しますが、ファクトリがオブジェクトの作成を担当するのではなく、その責任はインスタンス化するクラスを決定するサブクラスに委ねられます。

ファクトリ メソッド パターンの主要コンポーネント

  1. Creator: Creator は抽象クラスまたはインターフェイスです。オブジェクトを作成するためのメソッドであるファクトリ メソッドを宣言します。 Creator は製品を作成するためのインターフェイスを提供しますが、具体的なクラスは指定しません。

  2. コンクリート クリエーター: コンクリート クリエーターはクリエーターのサブクラスです。これらはファクトリ メソッドを実装し、どの具体的な製品クラスをインスタンス化するかを決定します。言い換えれば、各 Concrete Creator は特定の種類の製品の作成を専門としています。

  3. Product: Product は別の抽象クラスまたはインターフェイスです。ファクトリ メソッドが作成するオブジェクトのタイプを定義します。これらの製品は共通のインターフェイスを共有していますが、具体的な実装は異なる場合があります。

  4. コンクリート製品: コンクリート製品は製品のサブクラスです。これらは製品の特定の実装を提供します。各具体的なプロダクトは、ファクトリー メソッドによって作成された 1 つのタイプのオブジェクトに対応します。

以下は、Factory Method パターンを使用したシステム コードがどのように見えるかです。

ステップ 1: プロダクトの定義

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def make_sound(self):
        pass

class Dog(Animal):
    def make_sound(self):
        print("Bhow Bhow!")

class Cat(Animal):
    def make_sound(self):
        print("Meow Meow!")
ログイン後にコピー
ログイン後にコピー

ステップ 2: コンクリート製品の作成

## client code
if __name__ == '__main__':
    animal_type = input("Which animal should make sound Dog or Cat?")
    if animal_type.lower() == 'dog':
        Dog().make_sound()
    elif animal_type.lower() == 'cat':
        Cat().make_sound()
ログイン後にコピー
ログイン後にコピー

ステップ 3: 作成者の定義

...
...
class AnimalFactory:
    def make_sound(self, animal_type):
        return eval(animal_type.title())().make_sound()
ログイン後にコピー
ログイン後にコピー

ステップ 4: Concrete Creator の実装

## client code
if __name__ == '__main__':
    animal_type = input("Which animal should make sound Dog or Cat?")
    AnimalFactory().make_sound(animal_type)
ログイン後にコピー
ログイン後にコピー

クライアントは次のようにソリューションを利用できます:

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def make_sound(self):
        pass
ログイン後にコピー

ファクトリー メソッド パターン ソリューションにより、クライアントはシステムを拡張し、必要に応じてカスタムの動物実装を提供できるようになります。

ファクトリメソッドパターンの利点

  1. 分離: クライアント コードを具体的なクラスから分離し、依存関係を減らし、コードの安定性を高めます。

  2. 柔軟性: 多くの柔軟性がもたらされ、インスタンス化のために特定のクラスに束縛されずにコードが汎用化されます。このように、ConcreteProduct クラスではなくインターフェイス (Product) に依存します。

  3. 拡張性: 既存のコードを変更せずに新しい製品クラスを追加でき、オープンクローズの原則を促進します。

結論

ファクトリー メソッド デザイン パターンは、コードの保守性と適応性を維持しながら、オブジェクトを作成する体系的な方法を提供します。オブジェクトの種類が変化したり進化したりするシナリオに優れています。

フレームワーク、ライブラリ、プラグイン システム、およびソフトウェア エコシステムは、そのパワーの恩恵を受けます。これにより、システムは進化する要求に適応できます。

ただし、アプリケーションの特定のニーズと単純さの原則を考慮して、慎重に使用する必要があります。 Factory Method パターンを適切に適用すると、ソフトウェア システムの全体的な設計とアーキテクチャに大きく貢献できます。

コーディングを楽しんでください!!!

以上がファクトリおよびファクトリ メソッドの設計パターンを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート