AbstractFactory

解説

同一のものを少しづつパラメータ変えながら大量に生成する場合によく使う。以下が実際に使いそう

  • spawn メソッドを使用した生成による、内部処理の隠蔽
  • copy メソッドでの容易な別インスタンス生成
  • Builder pattern との複合もできそう? 一方で、クラスとかが過剰に増えるので簡易的に作りたい時は不向き

ユースケース

  • モンスター、アイテムなど spawn, drop, がキーワードになりうる
    • MineCract Mod 系のコードでよく見かけるのはこの理由からかも
  • シューティング系の弾

Codes

public class Entity
{
    [SerializeField] private string Name = "monster";
    public string Name { get => Name; set => Name = value ; }

    public void Initialize(string name)
    {
        this.name = Name;
    }
}

public class EntitySpawner
{

    [SerializeField] private Entity entityBase;

    public Spawn(String name)
    {
        Entity newEntity = new Entity();
        newEntity.Initialize(name);

        return newEntity;
    }
}

Singleton

解説

  • 以下特徴
    • Static で自分自身のメンバ変数持ってる
    • インスタンス生成タイミングで自分自身を保存
  • keyword : public static instance , isExist

ユースケース

  • MasterDataとか使える
  • Audio系にも使える 

構造系

Adapter

解説

  • 外部SDKを多用する場合
  • SDK とコアロジックの間に中間層を挟む
  • フォーマットが異なるけど用途が同じ input を持つ場合にその差異を吸収するクラス

ユースケース

  • 外部 SDK の Wrapperで見る(SNS投稿系)
    • SDK とコアロジックの間に中間層を挟む
classDiagram
	class corelogic {
	}
	class twittersdk {
	}
	class instagramsdk {
	}
	class snsAdapter {
	}

corelogic --> snsAdapter
snsAdapter -->instagramsdk
snsAdapter -->twittersdk

Bridge

解説

  • 基底クラスのメンバ変数として別クラスを作成する
    • 機能拡張をメンバ変数に委任する
    • Basehogehoge Class
  • 23種類のデザインパターンの1つ

  • Entity Class
    • 子クラスとして Monster / User / Animal クラス
    • Entity の機能として Conversation, Memory, History みたいな機能をつけたい時
      • メンバー変数として Entity に追加し、詳細は Class側で実装

Composite

解説

  • 入れ物のクラスと中身のクラスを1つの抽象クラスでまとめ、同一視できる
    • これによって再帰構造を構築できる -> 再帰構造構築のためのパターンの一つ
  • メリット
    • メソッド呼び出し側が、入れ物、中身を区別に実行できる
      • 例:フォルダに対する、ファイル orフォルダの追加
      • 例:木の葉に対する、木もしくは葉の追加
  • Invoke 側がLeafなのかCompositeなのかを意識しなくても統一した操作を可能に
    • ゲームで使うことそんなになさそう

ユースケース

  • UniRxは実装 Composite らしい
  • ファイルとフォルダで、フォルダはファイルをリストに持つが、どちらも同じく作成日時などを表示できる

Facade

解説

  • アプリケーション内部のクラス間で API を用意するパターン
  • 比較的関係が互いに疎なのに、メソッドは叩きたい場合
  • 複数人で開発する場合に良さそうか

Unity Project で見てみる

GitHub https://github.com/proyecto26/awesome-unity

めちゃ有名なやつ https://github.com/OpenHogwarts/hogwarts/tree/master/Assets

https://github.com/Reinisch/Darkest-Dungeon-Unity/tree/master/Assets

https://github.com/mofr/Diablerie/tree/master/Assets/Scripts/Diablerie/Game/World