Facade

ファサードパターンは、複雑なサブシステムの背後に単一の統合インターフェース(ファサード)を提供することで、サブシステムの使用を簡単にする構造的なデザインパターンです。ファサードは、サブシステムの複雑さをクライアントから隠蔽し、サブシステムに簡単にアクセスできるようにします。

使用シーン

ファサードパターンは以下のような場合に特に有用です:

  1. 複雑なサブシステムに対してシンプルなインターフェースを提供したい場合

    • 多くの異なるオブジェクト群に対して、簡潔で理解しやすいAPIを提供したいときに適しています。

  2. サブシステムを分離し、依存関係を減らしたい場合

    • クライアントと複数のサブシステム間の直接的なコミュニケーションを減らし、疎結合を保ちたい時に役立ちます。

メリットとデメリット

メリット

  • 簡略化:ファサードを通じてサブシステムを使うことで、クライアントはよりシンプルなインターフェースを使って操作できます。

  • 分離:サブシステムの詳細をクライアントから分離し、それぞれのサブシステムが独立して開発や変更を受けることが可能になります。

デメリット

  • ファサードのゴッドクラス化:一つの巨大なファサードクラスがシステムのすべての機能を包含してしまい、ゴッドクラス(すべてを行うクラス)になるリスクがあります。

サンプルコード(Python)

以下は、ホームシアターシステムの複数のコンポーネント(DVDプレイヤー、プロジェクター、ライトなど)を操作するためのファサードパターンの実装例です。

class DvdPlayer:
    def on(self):
        print("DVD Player turning on.")

    def play(self, movie):
        print(f"DVD Player playing {movie}.")

class Projector:
    def on(self):
        print("Projector turning on.")

    def setInput(self, input):
        print(f"Projector input set to {input}.")

class Lights:
    def dim(self, level):
        print(f"Lights dimming to {level}%.")

class HomeTheaterFacade:
    """ホームシアターシステムのファサードクラス"""
    
    def __init__(self):
        self.dvd = DvdPlayer()
        self.projector = Projector()
        self.lights = Lights()

    def watch_movie(self, movie):
        self.lights.dim(10)
        self.projector.on()
        self.projector.setInput("DVD")
        self.dvd.on()
        self.dvd.play(movie)

# クライアントコード
home_theater = HomeTheaterFacade()
home_theater.watch_movie("Inception")

このコード例では、HomeTheaterFacade クラスがファサードの役割を果たし、ホームシアターの複数のコンポーネントに対する操作を単一のメソッド watch_movie にまとめています。これにより、クライアントはファサードを通じてホームシアターシステム全体を簡単に操作できます。各コンポーネントの内部の複雑さはクライアントから隠蔽され、使いやすさが向上します。

この記事が気に入ったらサポートをしてみませんか?