LoginSignup
10
8

More than 5 years have passed since last update.

【デザインパターン】Facadeパターン

Posted at

概要

サブシステム内に存在する複数のインターフェイスに一つの統合インターフェイスを与えるパターン

以下の2種類のクラスからなる
1. Facadeクラス(クライアントからの要求をサブシステム内の適当なオブジェクトに委譲する)
2. サブシステム内のクラス(サブシステムの機能を実装している)

具体例と実装

エスプレッソマシーンを例にすると、

上記はそれぞれ

  1. 全自動エスプレッソコーヒーメーカークラス(AutoEspressoCoffeeMakerクラス。Grinder、Stamper、Steamer、Dripperの各クラスに処理を委譲してコーヒーの作成を行う)
  2. 豆挽きクラス、スタンピングクラス、ドリップクラス(それぞれGrinder、Stamper、Dripperクラス)

が対応する。
コードの詳細は以下

auto_espresso_coffee_maker.rb
class AutoEspressoCoffeeMaker
  def make_coffee(coffee_bean, density, size)
    grinder = Grinder.new(density, size)
    stamper = Stamper.new(density, size)
    dripper = Dripper.new(size)
    grinded_bean = grinder.grind(coffee_bean)
    return dripper.drip(samper.stamp(grinded_bean))
  end
end
grinder.rb
class Grinder
  def initialize(density, size)
    @coffee_bean = coffee_bean
    @density = density
    @size = size
  end

  def grind(coffee_bean)
    # 濃度、サイズに応じて豆を挽く
  end
end
stamper.rb
class Stamper
  def initialize(density, size)
    @density = density
    @size = size
  end

  def stamp(grinded_bean)
    # 濃度、サイズに応じてスタンピングする
  end
end
dripper.rb
class Dripper
  def initialize(size)
    @size = size
  end

  def drip(stamped_bean)
    # サイズに応じてドリップする
  end
end

メリット

  • クライアントがサブシステムを知らなくてよいため、クライアントが扱うオブジェクトが少なくなり、サブシステムの利用が容易になる
  • サブシステム内のクラスを直接利用する必要がある場合の妨げにならない

まとめ

クライアントに対してシステムの複雑さを軽減し、サブシステムとクライアントの結合を弱めるパターン

10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8