[問題] 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