单身人士代码摘录,面试问题

6 c# design-patterns

我有另一个面试问题.我觉得这很愚蠢,但也许有些东西我不知道了.问题是这是哪个GoF模式(答案:单身),如果有任何问题,我如何解决它们.

我没有看到任何问题.我提到这从未被释放过,我希望从这种模式中获得.这就是我所说的.我错过了什么吗?

public class Class1
{
    private static Class1 oInstance = null;
    private Class1() { }
    public static Class1 GetInstance()
    {
        if (oInstance == null)
        {
            oInstance  = new Class1();
        }
        return oInstance ;
    }
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 16

线程安全 - 如果从竞争线程调用GetInstance(),则可以创建多个实例.


Sam*_*ron 13

请参阅:.NET的明显单例实现?

在实现Singleton模式时,您需要考虑多个问题.

  • 多个调用者多个线程请求单例时会发生什么.它应该工作.
  • 何时调用Singleton实例构造函数.您可能希望推迟它,以便它在请求单例的第一个调用时发生,您可能希望它在其他时间首先实例化.
  • 人们应该能够继承你的单身人士课吗?这应该是什么行为?
  • 在实例化单例后,是否可以将单例实例切换到其他实例.回答"是"这违反了单身模式,因此一般来说,持有单身人士的领域应该是只读的.
  • API设计,您应该使用属性方法来返回Singleton实例.
  • 有人单身人士是邪恶的.你是否应该首先考虑它.这已经经常讨论了一个很好的起点是http://blogs.msdn.com/scottdensmore/archive/2004/05/25/140827.aspx

以下是您可以遵循的良好通用模式.它的线程安全,密封,使用属性和延迟instaniates单身.

public sealed class Singleton
{
    static class SingletonCreator
    {
        // This may seem odd: read about this at: http://www.yoda.arachsys.com/csharp/beforefieldinit.html
        static SingletonCreator() {}
        internal static readonly Singleton Instance = new Singleton();
    }

    public static Singleton Instance
    {
        get { return SingletonCreator.Instance; }
    }
}
Run Code Online (Sandbox Code Playgroud)


Joe*_*orn 6

其他人提到线程安全.还有一个事实是他们忘记将其标记为sealed,因此您可以继承它并以这种方式创建多个实例.