デザインパターン入門

Singletonパターン

たったひとつのインスタンス

どんな場合に使うのか

  • 指定したクラスのインスタンスが絶対に1個しか存在しないことを保証したい.
  • インスタンスが1個しか存在しないことをプログラム上で表現したい.

実装のポイント

この保証のために,コンストラクタをprivateにしておく.

サンプルプログラム

// Program.cs
using System;
namespace chap05 {
  class Program {
    static void Main(string[] args) {
      Console.WriteLine("Start.");
      Singleton obj1 = Singleton.getInstance();
      Singleton obj2 = Singleton.getInstance();
      if (obj1 == obj2) {
        Console.WriteLine("obj1とobj2は同じインスタンスです.");
      } else {
        Console.WriteLine("obj1とobj2は同じインスタンスではありません.");
      }
      Console.WriteLine("End.");
    }
  }
}

// Singleton.cs
using System;
namespace chap05 {
  class Singleton {
    private static Singleton sigleton = new Singleton();
    private Singleton() {
      Console.WriteLine("インスタンスを生成しました.");
    }
    public static Singleton getInstance() {
      return sigleton;
    }
  }
}

インスタンスの個数が3個に限定されたクラス

// Triple.cs
namespace chap05 {
  class Triple {
    private static Triple[] insts = new Triple[] { new Triple(), new Triple(), new Triple() };
    private Triple() { }
    public static Triple getInstance(int id) {
      return insts[id];
    }
  }
}

厳密にはSingletonパターンにはなっていない

  • 条件文がスレッドセーフではない!!
// Singleton.cs
using System;
namespace chap05 {
  class Singleton {
    private static Singleton sigleton;
    private Singleton() {
      Console.WriteLine("インスタンスを生成しました.");
    }
    public static Singleton getInstance() {
      if (sigleton == null) {
        sigleton = new Singleton();
      }
      return sigleton;
    }
  }
}
  • スレッドセーフ版
using System;
namespace chap05 {
  class Singleton {
    private static Singleton sigleton;
    private static object criticalsection = new object();
    private Singleton() {
      Console.WriteLine("インスタンスを生成しました.");
    }
    public static Singleton getInstance() {
      lock (criticalsection) {
        if (sigleton == null) {
          sigleton = new Singleton();
        }
        return sigleton;
      }
    }
  }
}

デザインパターン入門

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

管理人/副管理人のみ編集できます