C#のシングルトン(Singleton)のサンプルです。
目次
シングルトン | シングルトンとは |
シングルトンのサンプル |
シングルトン(Singleton)とは
- あるクラスのインスタンスを1つしか作成しないデザインパターンのことです。
- 再度インスタンスを呼ぶメソッドを実行した場合、1つめのインスタンスが返ります。
- コンストラクタのアクセス修飾子をprivateにして外部からnewできないようにします。
- クラスがロードされた初回に一度だけインスタンスが生成されます。
- 生成したインスタンスは、アクセス修飾子がprivateのstatic変数に保存します。
- インスタンスの取得はstaticメソッドから行います。
シングルトンのサンプル
シングルトンのサンプルです。
using System;
public sealed class Class1
{
private static Class1 c1 = new Class1();
private Class1() // privateのコンストラクタ
{
}
public static Class1 GetInstance()
{
return c1;
}
}
class Test1
{
static void Main()
{
Class1 c1 = Class1.GetInstance();
Class1 c2 = Class1.GetInstance();
if (c1 == c2)
{
Console.WriteLine("同じ"); //同じ
}
// コンパイルエラー アクセスできない保護レベルになっています
// Class1 c3 = new Class1();
}
}
クラスの生成
private static Class1 c1 = new Class1();
5行目は、privateの変数です。外部から参照できません。static修飾子があるのでインスタンスではなくクラスと紐づきます。
コンストラクタ
private Class1() // privateのコンストラクタ
{
}
7行目は、コンストラクタです。privateになっているので外部からnewできません。
インスタンスを返すメソッド
public static Class1 GetInstance()
{
return c1;
}
11~14行目は、5行目のインスタンスを返すメソッドです。
staticメソッドになっているのでインスタンスを生成せずにこのメソッドを利用できます。
インスタンスを返すstaticメソッドなのでstaticファクトリメソッドとも呼ばれます。
インスタンスを取得する
Class1 c1 = Class1.GetInstance();
Class1 c2 = Class1.GetInstance();
20行目は、11行目のメソッドを呼び出します。その時に5行目でインスタンスが生成されそのインスタンスが返ります。
21行目も、11行目のメソッドを呼び出しますが、20行目のメソッド実行時に生成されたインスタンスが返ります。
インスタンスの比較
if (c1 == c2)
{
Console.WriteLine("同じ"); //同じ
}
23行目は、インスタンス同士の比較をしています。同じなのでtrueになります。
インスタンスの生成
// コンパイルエラー アクセスできない保護レベルになっています
// Class1 c3 = new Class1();
28行目は、newでインスタンスの生成を行おうとしますが、7行目のコンストラクタがprivateのためコンパイルエラーになります。
関連の記事