[问题] singleton pattern物件初始化的时间点

楼主: poloball (吃不胖真无奈…)   2016-04-18 21:41:16
wiki的说明 singleton pattern 的实现常见有
lazy instantization 跟 eager instantization
依造设计用意
lazy 在第一次使用时才产生实例
eager 是物件加载时产生
不了解何时是所谓的"物件加载"
实际用以下2个class测试, 环境是 vs 2010 express
public class Singleton_lazy
{
private static Singleton_lazy instance;
public static string str = "lazy public attribute";
private Singleton_lazy()
{
Console.WriteLine("Singleton lazy initialized");
}
public static Singleton_lazy getInstance()
{
if (instance == null)
instance = new Singleton_lazy();
return instance;
}
public static string String()
{
return "lazy public method";
}
}
public class Singleton_Eager
{
private static readonly Singleton_Eager instance = new Singleton_Eager();
public static string str = "eager public attribute";
private Singleton_Eager()
{
Console.WriteLine("Singleton Eager initialized");
}
public static Singleton_Eager getInstance()
{
return instance;
}
public static string String()
{
return "eager public method";
}
}
测试3种情况
作者: Litfal (Litfal)   2016-04-20 17:21:00
A1: lazy应该不用解释,eager是静态初始化时new出来。而静态初始化会在第一次用到该类别时进行。因为这是由CLR控制的,所以你无法控制静态建构什么时候被执行,只能确定一定是在任何类别成员被使用之前执行。(MSDN原文) The user has no control on when the staticconstructor is executed in the program.Q2. readonly是设计,观念就是不应该会被更改,无论内外Q3. 资源笨重且不常使用则lazy较佳,轻量则eager较好写又能简单避免多执行绪问题
作者: ssccg (23)   2016-04-20 18:12:00
static getInstance这种lazy和eager通常差别不大,因为第一次用通常就是getInstance除非就像你说的有其他static method有机会先被用

Links booklink

Contact Us: admin [ a t ] ucptt.com