今天走在路上忽然想起一个问题,以前没有深入的注意到。c#
问题:若是在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时,咱们估计都须要ide
new PeopleServer();
这时,服务器端的内存中指定堆内就分配了一块内存用于存储新建立的PeopleServer对象,当执行结束时在销毁这个对象,想想若是咱们的服务器会说话,那他确定会这样骂你:尼玛每次建立的对像都同样,并且每次请求还都须要建立,你就不能只建立一个对象,你们的操做时都使用这同一个对象,那不就省事儿多了吗?性能
嘿嘿 懂个人意思了吗?接下来咱们这么设计代码:spa
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该对象信息的一些类的定义也能够这么来弄,懂得原理就可以在往后的项目中随机应变了。orm
再补充一种单例模式的写法:对象
public static PeopleServer GetPeopleServerByCache() { object obj = System.Web.HttpRuntime.Cache["PeopleServerCache"]; if (obj == null) { obj = new PeopleServer(); System.Web.HttpRuntime.Cache["PeopleServerCache"] = obj; } return (PeopleServer)obj; }
其实原理都同样。内存
屌丝的生活就是这样,打烊,睡觉
get