【发布时间】:2017-09-15 09:30:02
【问题描述】:
在找到Lazy<T> 类型之前,我使用以下模式来实现全局单例:
class DataModel
{
public static XmlSerializer Serializer
{
get { return SerializerFactory.instance; }
}
static class SerializerFactory
{
internal static readonly XmlSerializer instance =
new XmlSerializer(typeof(DataModel));
}
}
这种模式具有以下优点:
- 类型初始化是惰性的。
- 类型初始化是线程安全的。
- 单例访问只是一种没有方法调用的直接字段访问。
最近我看到很多帖子建议Lazy<T> 实现类似的单例访问模式。 Lazy<T>(或LazyInitializer)会给这个实现带来什么好处?
【问题讨论】:
-
我认为只有在构建这些实例成本高昂(时间、IO、内存方面)并且在启动时不会立即使用它时才有益。但一如既往:先衡量,然后根据证据做出决定。
-
这不是单身!它是一个延迟实例化的静态只读属性(属于 DataModel 类)。
-
老实说,我建议您在 90% 的情况下对单身人士使用 nother 选项。我会改为使用 IoC 容器(例如 Autofac),将类注册为容器中的单例,然后照常注入。 从而使单元测试更容易。
-
"你对单例的定义是什么" - Singleton Pattern : "...单例模式是一种软件设计模式,它将类的实例化限制为一个对象" - 您可以拥有多个
XmlSerializer实例,因此它不是单例。从任何 DataModel 对象返回的实例都是相同的,仅此而已。