【发布时间】:2016-03-21 11:32:43
【问题描述】:
我昨天在接受采访,其中一个问题是什么是单例以及如何实现它。
来自 MSDN 的解决方案 #1:
using System;
public class Singleton
{
private static Singleton instance;
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
我给出了最简单的解决方案(msdn 实现的解决方案 1),而他想要线程安全的解决方案(解决方案 3)。
来自 MSDN 的解决方案 #3:
using System;
public sealed class Singleton
{
private static volatile Singleton instance;
private static object syncRoot = new Object();
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
}
让我感兴趣的是 msdn 示例中的 private 构造函数。 我不知道有这样的东西存在。
public class Counter
{
private Counter() { }
public static int currentCount;
public static int IncrementCount()
{
return ++currentCount;
}
}
然后我问:
为什么你会有一个只有静态成员的类,因此想要阻止它的实例被创建,因此使用私有构造函数 - 而不是使类成为静态的?!
P.S.:问题不在于单例 - 是关于描述我会选择创建一个仅具有静态成员的可实例化类的场景(因此最终创建对私有构造函数的需求)而不是使用静态类。
【问题讨论】:
-
单例示例通常集中在“负责初始化单例的代码”上——实际上你会有实例成员,有时它会实现一个接口。
-
你应该给他的真正答案是,你不应该为实现单例而烦恼,而是使用 IOC 容器来控制对象的生命周期。
-
我确实想知道为什么人们仍然在编程面试中问有关单身人士的问题。
-
@YuvalItzchakov:也许它告诉了候选人申请的地方 - 他/她应该反思一下:-)
-
@Veverke - 请不要链接到外部资源,除非它是为了支持您问题中已有的内容。我们永远不知道外部链接何时会中断并使问题变得无用。