经验技巧分享--ASP.NET和Ajax应用一个超级实用的设计模式---享元工厂模式(泛型实现,模式名字不重要,关键是有用!)
超级大笨狼:经验技巧分享--ASP.NET和Ajax应用一个超级实用的设计模式---享元模式(泛型实现,模式名字不重要,关键是有用!)   
 在Web开发中,你是否困惑某些设计模式没什么用途或者不知所云?偶有心得,兴奋之余,不想独吞,特发出来大家分享.   
 问题起源:   
 1,Session[ "变量名称 "]对于编程,使用起来不方便,如果Session里面需要存储的变量名称过多,敲字符比较麻烦,如果根据Session[ "userID "]去数据库里存取,损失性能.   
 2,对于站内即时短消息,聊天,下棋性质的的程序,需要知道私聊对方的一些属性,由于通信频繁,而有些数据又没有长期保存的必要,所以需要一个类似2个用户共有的Session变量,这个变量可以随   用户/私聊/棋局   消失   
 而消失.   
 3,Ajax应用需要频繁的访问一些常用的对象变量,这些变量状态最好不要频繁从数据库读取,比如下棋的双方要知道对方是谁,颜色,走棋/聊天的变化等等,即是对方个人的东西,又是我方需要知道的内容,这些状态一经   
 创建,就要保留到用户离线为止.   
 4,相对精确判断离线的问题.   
 问题设想: 
 能不能创建一个类来实现一种Session一样的东东,对一个用户来说即可以单件模式创建,又可以指定的2个/几个用户在生存期共享?   
 可以用静态类的静态方法保证单件模式.返回一个实例来代替Session.这个办法类似设计模式里所说的享元模式或者某种工厂模式,叫他什么名字其实不重要,关键它很实用 
 .Net2.0以后提供了泛型,让实现这种模式更加方便,以下是精简的代码.   
 一,实体类: 
             public   class   User 
             { 
                         public   User(string   userId) 
                         {                            
                         } 
                         public   string   color; 
                         public   string   userId; 
                         public   string   userName; 
                         public   string   enmyUserName; 
                         public   string   enmyUserId; 
                         public   string   enmyColor; 
             } 
 二.管理实体类的类,叫它静态工厂也可以,用Dictionary来管理构造参数和返回的类,保证第一次创建后以后不重复创建. 
 public   static   class   UserManager 
             { 
                         public   static   Dictionary <string,   User>    Users   =   new   Dictionary <string,   User> (); 
                         public   static   User   getUser(string   UserId) 
                         { 
                                     if   (Users.ContainsKey(UserId)) 
                                     { 
                                                 return   (Users[UserId]); 
                                     } 
                                     else 
                                     { 
                                                 Users.Add(UserId,   new   User(UserId)); 
                                     } 
                                     return   (Users[UserId]); 
                         } 
             }   
 三,使用办法: 
 得到一个Use