はじめに
今回はUnityでSingletonパターンを試してみる記事です。
意外と使う機会があるパターンですが、気になることがあったので色々調べました。
サンプルプロジェクト
そもそもSingletonパターンとは
GoFの設計パターンの一つで、インスタンスを一つにすることで、データのアクセスや保存を円滑にするパターンです。Unityの場合は音関係などで使われたりしますかね。
単純に実装してみる
・継承前提パターン
gist0b90e5ea9153964a90d42af1c4c88f96
よく見かけるパターンの一つですね。複数個生成できないようにしつつ、削除されないようにすることで、インスタンスを保持しています。また、StaticかつPublicなのでどこからでもアクセス可能になっています。
そもそもMonobehaviorを継承する意味とは
Monobehaviorを継承すると、Gameobjectにアタッチ必要があるのでUnityの環境に依存するわけですが、そもそも継承させる必要はあるのでしょうか?Unityで動かすからと云って継承しなくても良いのではないでしょうか。というのは、ゲームオブジェクトとして運用するとうまく動かなくなったり、勝手に破壊されることがります。
・Monoを継承しないパターン
gista5e0455031ab07caae9426ae1eb71c26
スレッドセーフについて
上記で話していた問題は継承しないで普通に実装すれば良いのですが、別の問題として
スレッドセーフではないと云う問題もあったりします。よく起こるのはスレッドのごとにインスタンスが生成されてしまうパターンです。
gistd91026e2aece4c6f1864545b9c3aa8d4
上記のようにすることで、スレッドから観てオブジェを生成するタイミングを操り、複数個生成できないようにしています。これでスレッドセーフになりました(たぶん)。
別の方法としてLazyを使って必要とされるまで待つことで対応するのもありだと思います。
gist403d6bb05c17fd204404f939905bfd0e
おわりに
実はSingletonはアンチパターンとしても有名で、あまり使われていなかったりします。今回はUnityでSingletonパターンを試してみました。次は、Factoryパターンを実装してみようと思います。
是非、読者登録をしていただくと助かります!