アマチュアSEの勉強ブログ

アマチュアSEと一緒に勉強しましょ

デザインパターン(GoF)/Facade

本記事ではデザインパターンFacade(読:ファサード」について勉強していきましょう!



【ゴール】

「Facadeって〇〇のことで、〇〇な時に利用するんだ!」といえるようになること!

 

さて、ポイントはこの4つ!

  • GoFが作成したデザインパターンのうちの一つ
  • Facadeクラスという窓口を作ることで、異なるサブシステムを結びつける設計パターン
  • インターフェースを少なくし、複雑なものを単純に見せてくれる
  • サブシステム間の独立性を高めてくれる

この4つのポイントについて解説していきます!

デザインパターンとは?

JavaC++C#などのオブジェクト指向言語よく使われる設計をパターン化したものデザインパターンといいます。

本記事のタイトルにもある「GoF」というのは、このデザインパターンを作成した4人組のことで、彼らは全23パターンに分けています。

GoFの全23パターン

  • Template Method
  • Singleton
  • Adapter
  • Factory Method
  • Facade
  • Iterator
  • Abstract Factory
  • Bridge
  • Builder
  • Chain of Responsibility
  • Command
  • Composite
  • Decorator
  • Flyweight
  • Interpreter
  • Mediator
  • Mement(Snapshot)
  • Observer
  • Prototype
  • Proxy
  • State
  • Strategy
  • Visitor

本日はこの中から、「Facade」をご紹介します。

Facadeとは?

Facadeとは、「建物の正面」を意味する英単語です。
Facadeパターンは、GoFが作成したデザインパターン23個のうちの1つで、

  • Facadeクラスという窓口を作ることで、
  • 異なるサブシステムを結びつける

設計パターンです。

例えば、食堂での注文のシーン。
f:id:amateurSE:20210831112632p:plain
食堂のお兄さんは、注文を承ったら、「おさかな定食」ボタンを押します。
するとキッチンの人が、おさかな定食を作ってくれます。
f:id:amateurSE:20210831112709p:plain

~おさかな定食~

  1. おさかなのレシピ(おさかなの下処理をする⇒おさかなを焼く)
  2. 味噌汁のレシピ (具材を切る⇒お湯に具を入れる)
  3. ご飯のレシピ  (米を洗う⇒米を炊く)

食堂のお兄さんは、このおさかな定食を作るレシピは知らなくてもいい。ただ、ボタンを押すだけ。
これがFacadeパターンです。
おさかな定食の作り方のそれぞれのレシピがサブシステムになっていて、
「おさかな定食」というボタンが、「Facadeクラス」になります。

  • Facadeクラスという「おさかな定食」ボタンを作ることで、
  • 異なる工程レシピ結びつけています。

インターフェースを少なくし、複雑なものを単純に見せる
他の人が、とんかつ定食を頼んだ時、みそ汁、ご飯のレシピは使いまわせますよね。
サブシステム間の独立性を高めることもこのFacadeパターンの目的になります。

Facadeを使ってみる

上の食堂での注文シーンを例に、Facadeパターンを使っていきましょう。

まずは「レシピ」のサブシステムのサンプルプログラム。

class Fish {
        public void exec() {
                prepare();
                grill();
        }
        public void prepare() {
                // おさかなの下処理をする
        }
        public void grill() {
                // おさかなを焼く
        }
}
class Rice {
        public void exec() {
                wash();
                cook();
        }
        public void wash() {
                // 米を洗う
        }
        public void cook() {
                // 米を炊く
        }
}
class MisoSoup{
        public void exec() {
                prepare();
                cook();
        }
        public void prepare() {
                // 食材を切る
        }
        public void cook() {
                // お湯に食材を入れる
        }
}

それぞれのレシピ(サブシステム)を結び付けるFacadeクラスを作成します。

class FishSetMenuFacade {
        public static void cookFishSetMenu() {
                Fish fish = new Fish() ;
                Rice rice = new Rice() ;
                MisoSoup misoSoup = new MisoSoup() ;
                fish.exec();
                rice.exec();
                misoSoup .exec();
        }
}

FishSetMenuFacade クラス自体は、Fish、Rice、MisoSoupのサブクラスの中身を知らなくても、おさかな定食を作ることが出来ました。
インターフェースを少なくすることで、複雑なものを単純に見せてくれています

Facadeのクラス図

f:id:amateurSE:20210831123926p:plain
Facadeクラス図

Facadeクラス作成時のポイント

1.Facadeクラスはあくまでサブシステム内部に仕事を投げるだけで複雑な実装は持たない。
多様な機能の塊であるサブシステムから、サブシステムを利用するユーザーの用途に合わせた窓口(インターフェース)を提供するだけである。

2.Facadeクラスをサブシステム自体が利用する事はない。
Facadeクラスはあくまでサブシステム末端の窓口であるため、同じサブシステムから利用される事はない。

3.Facadeパターンはサブシステムの直接使用を妨げない。
Facadeクラスの利用は強制ではなく、必要であればサブシステムの機能を直接利用できる。
言語によっては無名名前空間やPackageスコープによりサブシステムを利用者から隔離できるが、Facadeパターンはそのような制限はしない。

Facadeパターンのメリット

Facadeパターンを使うことで下記のメリットがあります。

  • インターフェースを少なくすることで、複雑なものを単純に見せてくれる
  • サブシステム間の独立性を高めてくれる

まとめ

今回は、デザインパターンである「Facade」について勉強しました。いかがでしたでしょうか?

「Facade」について聞かれたときは、下記を言えるようになりましょう!

Facadeは、GoFが作成したデザインパターンのうちの一つで
Facadeクラスという窓口を作り異なるサブシステムを結びつける設計パターンのこと
インターフェースを少なくすることで、複雑なものを単純に見せてくれて、
サブシステム間の独立性を高めてくれる

 
ご覧いただきありがとうございました!