KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

(オススメ6)Python基礎 オブジェクト指向6(Facade) 構造に関するデザインパターン

登録日 :2025/09/26 04:19
カテゴリ :Python基礎

Facadeとは

フランス語で「建物の正面」という意味

複雑な内部処理をまとめ、システムの外側に簡素化されたインターフェース(API)を提供するパターン
(システムの内側にある各クラスの役割や依存関係を考えて、正しい順番でクラスを利用できるようにする)

構造に関するデザインパターン

構成要素

Facade

  • Clientに高レベルでシンプルなインターフェースを提供する
  • システム内部のクラス同士の関係を知っている
  • 実際の処理はシステム内部のクラスに移譲する

その他クラス

  • それぞれの機能を持っている
  • Facadeのことは意識しない
  • Facadeを呼び出すことはない

オブジェクト指向的要素

「カプセル化」を利用したパターン

  • クライアントからはFacadeクラスで提供されたAPIのみが見える
  • システム内部のクラス群を非常に大きなクラスと捉えると、Facadeで提供されたAPIメソッドに相当する
  • システム内部のクラス群の状態は構造、複雑さを隠蔽している

メリット・デメリット

メリット

  • その他クラスの構成要素を隠蔽することができる

  • その他クラスとクライアントの結びつきを弱くする

デメリット

  • Facadeクラスがその他クラスの全てに結合されたゴッドクラスになる可能性がある
    (ゴッドクラス:その他あらゆるクラスと結びつき、全能なクラス。明らかない単一責任の原則に違反しているなど、望ましくない設計の代表例)

使い所

  • 複雑なサブシステムの一部の機能を使用する場合
    クライアントが内部構造を知らなくてもシンプルなAPIで機能を利用できる

  • 複数のクラスの処理を呼び出す一連のコードが色々な箇所に書かれている場合

サンプルコード

商品の注文を行う例(Order-> Invoice, Payment, Product)

class Product(object):
    @staticmethod
    def get_product(_name: str):
        print(f"{_name}を取得しました")


class Payment(object):
    @staticmethod
    def make_payment(_name: str):
        print(f"{_name}の支払いが完了しました")


class Invoice(object):
    @staticmethod
    def send_invoice(_name: str):
        print(f"{_name}の請求書が送信されました")


class Order(object):
    """ Facade """
    def __init__(self):
        self.__product = Product()
        self.__payment = Payment()
        self.__invoice = Invoice()

    def place_order(self, _name: str):
        print("注文処理")
        self.__product.get_product(_name)
        self.__payment.make_payment(_name)
        self.__invoice.send_invoice(_name)
        print("注文が正常に完了しました")


if __name__ == '__main__':
    order = Order()

    order.place_order('洗濯機')