c# でシングルトン
C#でシングルトンを書くことがままあるのですが,何かその都度調べてる気がするので,φ(`д´)メモメモ...メモ
シングルトン (singleton) って何じゃらほい?
シングルトンとは,そのクラスのインスタンスが一つしか存在しないことを保障するデザインパターンです.
つまり,プログラムの中でそのクラスの実体が一つしかないため,他のいろんなクラスで同じものを利用することができるのです.
一見,すごく便利そうに思えるのですが,ガベージコレクションでひっかかったり,テストが書きにくかったりといろいろ落とし穴があったりします.
シングルトンのメリットデメリットに関しては,こちらのサイトが参考になります.
いつ使うの?
今でしょ!!!
という冗談はさて置き,私が使う場面としては,UDPやTCPで何かしらのデータを受ける際の窓口クラスとしてです.
一旦,シングルトンで作成したクラスに受診したデータを保管し,その他の様々なクラスから,そのデータを参照するといった形です.
これが正しい方法なのかは,いまいち自信ないですが…
コードメモ
私がC#でシングルトンを使用する時,多くの場合で,明示的にメモリの解放も行いたかったりするので,そのあたりを合わせたコードを記載します.
using System; public class Singleton : IDisposable { private static Singleton _instance = new Singleton (); private Singleton (){} // コンストラクタをprivateで定義して,外部からアクセスさせない // 唯一のインスタンスの受け渡し口 public static MessageContainer GetInstance() { return _instance; } ~Singleton () { Dispose(); } private Boolean _isDisposed = false; public void Dispose() { Dispose(true); // Dispose() が明示的に呼ばれた時に,ガベージコレクションでFinalize()呼び出しをしない GC.SuppressFinalize(this); } private void Dispose(bool disposing) { if (_isDisposed) return; if (disposing) { // 明示的に解放する必要のあるメンバ変数の解放処理をここに記載する } _isDisposed = true; } }
以上,メモでした.