单体模式(Singleton)是经常为了保证应用程序操作某一全局对象,让其保持一致而产生的对象,例如对文件的读写操作的锁定,数据库操作的时候的事务回滚,还有任务管理器操作,都是一单体模式读取的。
创建一个单体模式类,必须符合三个条件:
1:私有构造函数(防止其他对象创建实例);
2:一个单体类型的私有变量;
3:静态全局获取接口
下面我写一个类,为了看是不是单体,就加了一个计数器,如果是同一个类,那么这个类的计数每次调用以后就应该自动加一,而不是重新建对象归零:
.NET c# 单体模式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
using
System;
using System.Threading;
public class Singleton
{
private int ObjCount = 0 ;
private Singleton()
{
Console.WriteLine( " 创建对象 " );
}
private static Singleton objInstance = null ;
public static Singleton getInstance()
{
if (objInstance == null ) objInstance = new Singleton();
return objInstance;
}
public void ShowCount()
{
ObjCount ++ ;
Console.WriteLine( " 单个对象被调用了{0}次 " , ObjCount);
}
};
using System.Threading;
public class Singleton
{
private int ObjCount = 0 ;
private Singleton()
{
Console.WriteLine( " 创建对象 " );
}
private static Singleton objInstance = null ;
public static Singleton getInstance()
{
if (objInstance == null ) objInstance = new Singleton();
return objInstance;
}
public void ShowCount()
{
ObjCount ++ ;
Console.WriteLine( " 单个对象被调用了{0}次 " , ObjCount);
}
};
然后我们来测试一下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
public
class
ConsoleTest
{
public static void Main( string [] args)
{
Console.WriteLine( " 开始执行单体模式 " );
for ( int i = 0 ; i < 5 ; i ++ )
{
Singleton.getInstance().ShowCount();
}
Console.ReadLine();
}
};
{
public static void Main( string [] args)
{
Console.WriteLine( " 开始执行单体模式 " );
for ( int i = 0 ; i < 5 ; i ++ )
{
Singleton.getInstance().ShowCount();
}
Console.ReadLine();
}
};
我在这个Main里面执行了5次,看看输出的结果:
开始执行单体模式
创建对象
单个对象被调用了1次
单个对象被调用了2次
单个对象被调用了3次
单个对象被调用了4次
单个对象被调用了5次
在这里可以看出,每次都是使用的同一个对象,实现了单体。
为了测试在多线程下面是否是单体,下面我写了一个多线程测试的: 代码
class
ApartmentTest
{
public static void RunMoreThread()
{
Thread newThread = new Thread( new ThreadStart(ThreadSingleMethod));
newThread.SetApartmentState(ApartmentState.MTA);
Console.WriteLine( " ThreadState: {0}, ApartmentState: {1},ManagedThreadId:{2} " , newThread.ThreadState, newThread.GetApartmentState(), newThread.ManagedThreadId);
newThread.Start();
}
public static void ThreadSingleMethod()
{
Singleton.getInstance().ShowCount();
}
};
{
public static void RunMoreThread()
{
Thread newThread = new Thread( new ThreadStart(ThreadSingleMethod));
newThread.SetApartmentState(ApartmentState.MTA);
Console.WriteLine( " ThreadState: {0}, ApartmentState: {1},ManagedThreadId:{2} " , newThread.ThreadState, newThread.GetApartmentState(), newThread.ManagedThreadId);
newThread.Start();
}
public static void ThreadSingleMethod()
{
Singleton.getInstance().ShowCount();
}
};
然后每次for循环执行ApartmentTest.RunMoreThread();
再看看输出的结果:开始执行单体模式
ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:
3
创建对象
单个对象被调用了1次
ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:
4
单个对象被调用了2次
ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:
5
单个对象被调用了3次
ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:
6
单个对象被调用了4次
ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:
7
单个对象被调用了5次
根据ManagedThreadId,可以看出不同的线路访问达到了单体,OK!
c#的单体模式介绍完毕;