今天走在路上突然想起一個問題,之前沒有深刻的注意到。
問題:如果在WebForm頁面周期中如果 一個對象頻繁創建,請求結束後又進行銷毀肯定會對系統產生一定的性能影響,我們都知道,當我們每次new 一個對象時,其都在內存中指定的堆上分配一塊空間,那麼創建這個對象然後銷毀(Response.End()執行後) 這個對象肯定要消耗服務器的時間及空間(尤其是並行請求數量很大的時候,撐破內存也不是不可能),因為 每個請求都會建這個對象。然後大家有沒有注意到,有些類可能是這樣的,舉個例子:
public class PeopleServer { public PeopleServer() { } public string ToStringPeople(People p) { return string.Format("Name:{0},Age:{1};", p.Name, p.Age); } } public class People { public string Name { get; set; } public int Age { get; set; } }
那麼當我們每次需要打印People時,我們估計都需要
new PeopleServer();
這時,服務 器端的內存中指定堆內就分配了一塊內存用於存儲新創建的PeopleServer對象,當執行結束時在銷毀這個對象 ,想一想如果我們的服務器會說話,那他肯定會這樣罵你:尼瑪每次創建的對像都一樣,而且每次請求還都需 要創建,你就不能只創建一個對象,大家的操作時都使用這同一個對象,那不就省事兒多了嗎?
嘿嘿 懂我的意思了嗎?接下來我們這麼設計代碼:
public class PeopleServer { private static PeopleServer _people; public PeopleServer() { } public string ToStringPeople(People p) { return string.Format("Name:{0},Age:{1};", p.Name, p.Age); } //該方法必須為靜態的方便其他對象去調用 public static PeopleServer GetPeopleServer() { if (_people == null) { _people = new PeopleServer(); } return _people; } } public class People { public string Name { get; set; } public int Age { get; set; } }
看到GetPeopleServer這個方法是不是有種恍然大悟的感覺?那麼我們每次去格式化People這個對 象是只需要這麼幾行代碼:
People p = new People() { Age = 23, Name = "tongling" }; PeopleServer pServer = PeopleServer.GetPeopleServer(); pServer.ToStringPeople(p);
減少了內存堆得額外開銷系統當然會更快些,這就是幾天我們要說的 單例模式的應用場景,再比如某些配置數據,也就是對象信息在第一次創建後就不需要改變的只需要Get該對 象信息的一些類的定義也可以這麼來弄,懂得原理就能夠在日後的項目中隨機應變了。