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;
}
}
Links
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