この記事について
デザインパターンについて勉強したアウトプット記事です。
記事の内容で、おかしな点や間違った利用をしている場合、お手数ですがコメントにてご指摘ください!
参考にしたリンク
Facadeパターンとは
Facade(ファサード)パターンについて簡潔に説明をすると、複雑な処理を簡単に利用できる窓口を用意して、利用してもらう考え方です。複雑な処理を窓口にすることによって、利用者には内部処理を隠蔽した状態で利用させることができます。
実装したソースコード
ソースコード
今回、PlayerControllerがファサードクラス(PlayerDateProvider)を利用しています。using UnityEngine;
// プレイヤーの動作を制御しているクラス
public class PlayerController : MonoBehaviour
{
[SerializeField]
private PlayDataProvider dateProvider;
private void Update()
{
dateProvider.UpdateInput();
dateProvider.UpdatePosition();
}
}
窓口の役割をしているファサードクラスでは、プレイヤーの入力処理の更新や座標移動処理などの内部処理を実装しています。
using UnityEngine;
// 窓口の役割を行っているクラス
public class PlayDataProvider : MonoBehaviour
{
public Vector2 MoveDir => inputManager.MoveInputDir;
private PlayerInputManager inputManager;
private PlayerPositionManager positionManager;
public void UpdateInput()
{
inputManager.UpdateInput();
}
public void UpdatePosition()
{
positionManager.UpdateMovePos(inputManager.MoveInputDir);
}
private void Start()
{
inputManager = new();
positionManager = new();
}
}
ファサードクラスで利用されているサブシステム(内部処理)のクラス
using UnityEngine;
// プレイヤーの入力を管理しているクラス
public class PlayerInputManager
{
public Vector2 MoveInputDir { get; private set; }
public void UpdateInput()
{
var moveInputDir = new Vector2(Input.GetAxis("Horizontal"),
Input.GetAxis("Vertical"));
MoveInputDir = moveInputDir;
}
}
using UnityEngine;
// プレイヤーの座標を管理しているクラス
public class PlayerPositionManager
{
public void UpdateMovePos(Vector2 moveDir)
{
if (moveDir != Vector2.zero)
{
Debug.Log("プレイヤーが移動している");
}
else
{
Debug.Log("プレイヤーが止まっている");
}
}
}
メリット
- 複雑な処理をまとめる
ファサードクラスを利用するクラスではメソッドだけを実行しているので、具体的な処理を知らない状態でメソッドを利用できる利点があります。 - パラメーター参照に利用する
今回は入力と移動処理で実装を行いましたが、プレイヤーのパラメーターを別々のクラスで管理している場合、パラメーターを参照する窓口として利用することが出来ます。
デメリット
- 関係ない処理や値を利用できる危険性がある
例えばですが、プレイヤーの処理や値を沢山詰め込んで実装を行った時に、ファサードクラスを参照するだけで、プレイヤーの動作を、関係のないクラスから実行できる危険性があります。
※ 今回、自分が利用して感じたデメリットを記述しています。
どんな時に使うべきか
個人的には、以下の状況に利用しても良いなと感じました。
- 複雑な処理を簡単に利用したい時
- 参照しないといけないクラスが沢山ある時
- 短期開発