.Net中的单例模式是不可能的?

Sau*_*abh 3 .net singleton design-patterns

我有一个非常有趣的情况,我已经发现使用.net框架(任何版本)都不可能使用Singleton模式

看下面这段代码

namespace SingletonPattern
{
    class Singleton
    {
    private static readonly Singleton instance = new Singleton();
    private static int mcount = 0;

    private Singleton() {

        mcount += 1;
        Console.WriteLine("Creating {0} instances of Singleton Class", mcount.ToString());
    }

    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }
}

class program
{
    static void Main()
    {
        for (int i = 0; i < 1000; i++)
        {
            System.Activator.CreateInstance(Type.GetType("SingletonPattern.Singleton"), true);
        }

        Console.ReadLine();


        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在System.activator的帮助下,任何好友都可以打破单件模式.

谁有风险呢?

任何编写一些许可组件的人,其中许可证是作为单例模式实现的.

任何基于服务器的代码都使用Singleton模式.

也许我错了或者我的发现没有意义,但我只想分享并想知道你的看法?

Dal*_*ale 28

仅仅因为以这种方式故意绕开模式并不意味着模式本身" 不可能 ".


And*_*are 13

确实,单例的实现是错误的,但这并不意味着有人无法创建更好的单例实现.

  • 有关有用的单例模式的详细讨论,请查看http://yoda.arachsys.com/csharp/singleton.html (6认同)

Fen*_*Fen 11

出于同样的原因,所有私有方法都不是私有的,因为您可以使用反射访问它们.

我没有看到这个问题.


Jor*_*ren 7

要使用System.Activator.CreateInstance,您需要高权限.当然,如果您被允许忽略访问修饰符,因为系统信任您,那么您可以破坏依赖于消费者尊重访问修饰符的代码.

通常,代码通常不具有这些权限.