Singleton实现比较

运行下图中 C# 代码,输出的结果是什么?并请比较这两个类型各有什么特点,有哪些区别

namespace Singleton

{

    public sealed class Singleton1

    {

        private Singleton1()

        {

            Console .WriteLine("Singleton1 constructed" );

        }

        public static void Print()

        {

            Console .WriteLine("Singleton1 Print" );

        }

        private static Singleton1 instance = new Singleton1 ();

        public static Singleton1 Instance

        {

            get

            {

                return instance;

            }

        }

    }

 

    public sealed class Singleton2

    {

        Singleton2()

        {

            Console .WriteLine("Singleton2 constructed" );

        }

        public static void Print()

        {

            Console .WriteLine("Singleton2 Print" );

        }

        public static Singleton2 Instance

        {

            get

            {

                return Nested .instance;

            }

        }

        class Nested

        {

            static Nested() { }

 

            internal static readonly Singleton2 instance = new Singleton2 ();

        }

    }

 

    class Program

    {

        static void Main(string [] args)

        {

            Singleton1 .Print();

            Singleton2 .Print();

        }

    }

}

答案 : 输出三行:第一行 “Singleton1 constructed” ,第二行 “Singleton1 Print” ,第三行 “Singleton2 Print”

当我们调用 Singleton1.Print 时, .NET 运行时会自动调用 Singleton1 的静态构造函数,并初始化它的静态变量。此时会创建一个 Singleton1 的实例,因此会调用它的构造函数 Singleton2 的实例是在 Nested 的静态构造函数里初始化的。只有当类型 Nested 被使用时,才回触发 .NET 运行时调用它的静态构造函数。我们注意到我们只在 Sington2.Instance 里面用到了 Nested 。而在我们的代码中,只调用了 Singleton2.Print 。因此不会创建 Singleton2 的实例,也不会调用它的构造函数

这两个类型其实都是单例模式( Singleton )的实现。第二个实现 Singleton2 只在真的需要时,才会创建实例,而第一个实现 Singleton1 则不然。第二个实现在空间效率上更好。

你可能感兴趣的:(Singleton实现比较)