单件模式

单例模式详解

特点:
     1:单例类只能有一个实例。
     2:单例类必须自己创建自己的唯一实例。
     3:单例类必须给所有其它对象提供这一实例。

应用:
      每台计算机可以有若干个打印机,但只能有一个Printer Spooler,避免两个打印作业同时输出到打印机。 
   一个具有自动编号主键的表可以有多个用户同时使用,但数据库中只能有一个地方分配下一个主键编号。否则会出现主键重复。

代码实现:

None.gifpublic sealed class Singleton
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    Singleton()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public static Singleton Instance
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
get
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
return Nested.instance;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
InBlock.gif    
class Nested
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
// Explicit static constructor to tell C# compiler
InBlock.gif        
// not to mark type as beforefieldinit
InBlock.gif
        static Nested()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
internal static readonly Singleton instance = new Singleton();
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif 
None.gif

代码

ExpandedBlockStart.gifContractedBlock.gif    /**//// <summary>
InBlock.gif    
/// 泛型实现单例模式
InBlock.gif    
/// </summary>
ExpandedBlockEnd.gif    
/// <typeparam name="T">需要实现单例的类</typeparam>

None.gif    public class Singleton<T> where T : new()
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 返回类的实例
ExpandedSubBlockEnd.gif        
/// </summary>

InBlock.gif        public static T Instance
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get dot.gifreturn SingletonCreator.instance; }
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
class SingletonCreator
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
internal static readonly T instance = new T();
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    }

None.gif
//某一个类
None.gif
public class Test
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
private DateTime _time;
InBlock.gif
InBlock.gif    
public Test()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        System.Threading.Thread.Sleep(
3000);
InBlock.gif        _time 
= DateTime.Now;    
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public string Time
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _time.ToString(); }
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
//调用
None.gif        
// 使用单例模式,保证一个类仅有一个实例
None.gif
        Response.Write(Singleton<Test>.Instance.Time);
None.gif        Response.Write(
"<br />");
None.gif        Response.Write(Singleton
<Test>.Instance.Time);
None.gif        Response.Write(
"<br />");
None.gif
None.gif        
// 不用单例模式
None.gif
        Test t = new Test();
None.gif        Response.Write(t.Time);
None.gif        Response.Write(
"<br />");
None.gif        Test t2 
= new Test();
None.gif        Response.Write(t2.Time);
None.gif        Response.Write(
"<br />");


特别提醒的是由于静态方法是线程共享的所以数据库连接字符串不能是静态类型.
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值