<一覧に戻る

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

ファクトリメソッドパターンは、オブジェクトの生成をサブクラスに委譲することによって、クラスのインスタンス化を柔軟にするデザインパターンです。このパターンを使用することで、クライアントコードは生成するオブジェクトの具体的なクラスを知らずに済み、コードの保守性と拡張性が向上します。

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

  • オブジェクトの生成をカプセル化: 具体的なクラスのインスタンス化を隠蔽し、クライアントコードの依存を減らします。
  • コードの再利用: 新しいクラスを追加する際に、既存のクライアントコードを変更せずに済む場合があります。
  • テストの容易さ: モックやスタブを利用して、テストしやすくなります。

実装例

以下にファクトリメソッドパターンの簡単な実装例を示します。この例では、異なる種類の車を生成するファクトリメソッドを実装します。

1. 車のインターフェースを定義

class Car:
    def drive(self):
        raise NotImplementedError("Subclasses must implement this method")

2. 具体的な車のクラスを実装

class Sedan(Car):
    def drive(self):
        return "Driving a sedan!"

class SUV(Car):
    def drive(self):
        return "Driving an SUV!"

3. 車を生成するファクトリクラス

class CarFactory:
    def create_car(self, car_type):
        if car_type == "sedan":
            return Sedan()
        elif car_type == "suv":
            return SUV()
        else:
            raise ValueError("Unknown car type")

4. クライアントコード

def main():
    factory = CarFactory()

    car1 = factory.create_car("sedan")
    print(car1.drive())  # 出力: Driving a sedan!

    car2 = factory.create_car("suv")
    print(car2.drive())  # 出力: Driving an SUV!

if __name__ == "__main__":
    main()

コードの解説

  1. インターフェース Car: すべての車の共通のインターフェースを定義します。このクラスは drive メソッドを持ち、サブクラスで実装されることが期待されます。

  2. 具体的なクラス SedanSUV: Car クラスを継承し、具体的な車の動作を実装します。各クラスは drive メソッドを具体的に実装し、それぞれの動作を返します。

  3. ファクトリクラス CarFactory: 車の種類に応じて適切なインスタンスを生成します。create_car メソッドは、受け取った車の種類に基づいて、適切なクラスのインスタンスを返します。

  4. クライアントコード: CarFactory を使って車のインスタンスを生成し、それぞれの drive メソッドを呼び出して動作を確認します。

まとめ

ファクトリメソッドパターンは、オブジェクト生成の柔軟性を提供し、クライアントコードの依存を減らす強力なデザインパターンです。このパターンを使用することで、コードの保守性や拡張性を向上させることができます。新しい車の種類を追加する場合でも、クライアントコードを変更せずに済むため、開発の効率を高めることができます。

出力結果: