Facade

デザインパターンとは

デザインパターンとはオブジェクト思考開発における先人たちが作り上げてきた便利な設計図です。

Gang of Four通称Gofが1994年に出版した『オブジェクト指向における再利用のためのデザインパターン』の中で23個の設計図が紹介されています。

Note

デザインパターンのサンプルコードはSwift4でまとめます。

ファサードパターンとは?

プログラムが大きくなると複数のクラスをまたいで処理を行わなければいけなくなることがあります。

メインのクラスが全ての処理を持っているとコードが煩雑になってしまい、開発者も全てを理解していないといけません。

この問題を解決するためにFacadeクラスに処理を押し込めることで開発者はFacedeができることを理解していれば裏側の処理を全て知らなくても実装をすることができます。

サンプルコード

サンプルコードでは筋トレでムキムキ鍛えることを例に挙げてプログラムを作成します。

鍛たいと思っても、どんなトレーニング内容をこなして、どんなサプリメントを飲めばいいのかわからず、それを調べるところからしなくてはいけません。

しかしFacadeクラスを作成すれば問題は解決します。今回の例で言うとトレーナーに聞くことです。

ムキムキになるためのクラス

筋肉は数値では測ることは本来できませんが、トレーニングをしたら筋肉が5上昇!サプリメントを飲んだら筋肉が10上昇するとします。

class Training {
    func doTraining(muscle: Int) -> Int {
        return muscle + 5
    }
}

class Supplement {
    func drink(muscle: Int) -> Int{
        return muscle + 10
    }
}

Facade(トレーナー)

筋肉を増やすために必要なTrainingSupplementのクラスをoptimalTrainingメソッドの中に押し込めています。 

class Trainer {
    func optimalTraining(muscle: Int) -> Int {
        var visitorMuscle = muscle
        
        //トレーニングをする
        let training = Training()
        visitorMuscle = training.doTraining(muscle: visitorMuscle)
        
        //サプリメントを飲む
        let protain = Supplement()
        visitorMuscle = protain.drink(muscle: visitorMuscle)
        
        return visitorMuscle
    }
}

ムキムキになりたい人(呼び出し元)

ジムに通っている人はトレーナーの指示に従うことで筋肉を増やすことができます。

var myMuscle = 0
let trainer = Trainer()

myMuscle = trainer.optimalTraining(muscle: myMuscle)
print(myMuscle)

ソースコード一覧

import UIKit

class Training {
    func doTraining(muscle: Int) -> Int {
        return muscle + 5
    }
}

class Supplement {
    func drink(muscle: Int) -> Int{
        return muscle + 10
    }
}

class Trainer {
    func optimalTraining(muscle: Int) -> Int {
        var visitorMuscle = muscle
        
        //トレーニングをする
        let training = Training()
        visitorMuscle = training.doTraining(muscle: visitorMuscle)
        
        //サプリメントを飲む
        let protain = Supplement()
        visitorMuscle = protain.drink(muscle: visitorMuscle)
        
        return visitorMuscle
    }
}

var myMuscle = 0
let trainer = Trainer()

myMuscle = trainer.optimalTraining(muscle: myMuscle)
print(myMuscle)

参考文献

Facadeパターン

Swiftで学ぶデザインパターン21 (Facadeパターン)

デザインパターン

前の記事

Flyweight
デザインパターン

次の記事

Abstract Factory