C#デザインパターン  - Singleton

ここに掲載したコードは、『増補改訂版Java言語で学ぶデザインパターン入門 / 結城 浩(著)』に掲載されているサンプルコードをC#に移植したものです。
解説らしい解説は載せていませんので、『増補改訂版Java言語で学ぶデザインパターン入門 / 結城 浩(著)』も合わせてお読みください。

※当ソースは、Visual C# 2008 Express Editionで動作を確認しています。
  Visual Studio 2005をお使いの方は、ブログの記事を残しておきますので、そちらをご覧ください。



■Singleton.cs
using System;

namespace Gushwell.DesignPatterns {

    public sealed class Singleton {
        public static Singleton Instance {
            get { return singleton; }
        }

        private static readonly Singleton singleton = new Singleton();
        
        private Singleton() {
            Console.WriteLine("インスタンスを生成しました。");
        }
    }
}



■Triple.cs
// おまけ
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Gushwell.DesignPatterns {
    // インスタンスを3つに限定です。
    public class Triple {
        public static Triple GetInstance(int n) {
            return triple[n];
        }

        private static readonly Triple[] triple = 
            new[] { new Triple(), new Triple(), new Triple() };

        private Triple() {
            Console.WriteLine("インスタンスを生成しました。");
        }
    }
}




■Program.cs
using System;


namespace Gushwell.DesignPatterns {
    public class Program {
        public static void Main(System.String[] args) {
            Console.WriteLine("Start.");
            Singleton obj1 = Singleton.Instance;
            Singleton obj2 = Singleton.Instance;
            if (obj1 == obj2) {
                Console.WriteLine("obj1とobj2は同じインスタンスです。");
            } else {
                Console.WriteLine("obj1とobj2は同じインスタンスではありません。");
            }
            Console.WriteLine("End.");

            Triple t0 = Triple.GetInstance(0);
            Triple t1 = Triple.GetInstance(1);
            Triple t2 = Triple.GetInstance(2);
            Triple t3 = Triple.GetInstance(0);
            Triple t4 = Triple.GetInstance(1);
            Triple t5 = Triple.GetInstance(2);
            if( t0 == t1)
                Console.WriteLine("t0とt1は同じインスタンスです。");
            if (t0 == t2)
                Console.WriteLine("t0とt2は同じインスタンスです。");
            if (t0 == t3)
                Console.WriteLine("t0とt3は同じインスタンスです。");
            if (t0 == t4)
                Console.WriteLine("t0とt4は同じインスタンスです。");
            if (t0 == t5)
                Console.WriteLine("t0とt5は同じインスタンスです。");
            if (t1 == t2)
                Console.WriteLine("t1とt2は同じインスタンスです。");
            if (t1 == t3)
                Console.WriteLine("t1とt3は同じインスタンスです。");
            if (t1 == t4)
                Console.WriteLine("t1とt4は同じインスタンスです。");
            if (t1 == t5)
                Console.WriteLine("t1とt5は同じインスタンスです。");
        }
    }
}