单例模式 泛型

 

很早就知道单例模式了,但是始终没有仔细看过,虽然写代码的时候也比较常用,但是注意到的也比较少。

 

今天刚好有时间,突然看到项目中的好多代码都在类中直接写的单例,然后就想弄个泛型的岂不是能更好一些。就简单的写了些代码,注释和总结了一下。写完了第一种后上网查查,然后发现还有很多的实现方法

 

下面列了3种实现,内部类的那个是在网上看到java的。就算做个学习备份吧。


单例类:

View Code
using System;

namespace ConsoleSingletonTest
{
/*
* 单例模式(Singleton) 泛型 单例模式
* 定义:单例模式的意思就是只有一个实例(整个应用程序的生命周期中)。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。(百度百科~~!)
* 要点: 一是某个类只能有一个实例;
* 二是它必须自行创建这个实例;
* 三是它必须自行向整个系统提供这个实例。
* create by jt 2011-10-27
*/
public class MySingleton<T> where T : class//new(),new不支持非公共的无参构造函数
{
#region 实现一
/*
* 单线程测试通过!
* 多线程测试通过!
* 根据需要在调用的时候才实例化单例类!
*/
private static T _instance ;
public static readonly object SyncObject = new object();
public static T GetInstance()
{
if (_instance == null)//没有第一重 singleton == null 的话,每一次有线程进入 GetInstance()时,均会执行锁定操作来实现线程同步,
//非常耗费性能 增加第一重singleton ==null 成立时的情况下执行一次锁定以实现线程同步
{
lock (SyncObject)
{
if (_instance == null)//Double-Check Locking 双重检查锁定
{
//_instance = new T();
//需要非公共的无参构造函数,不能使用new T() ,new不支持非公共的无参构造函数
_instance = (T)Activator.CreateInstance(typeof(T), true); //第二个参数防止异常:“没有为该对象定义无参数的构造函数。”
}
}
}
return _instance;
}
public static void SetInstance(T value)
{
_instance = value;
}

#endregion

#region 实现二

/*
* 单线程测试通过!
* 多线程测试通过!
* 主动实例化单例类!
* 注:使用静态初始化的话,无需显示地编写线程安全代码,C# 与 CLR 会自动解决多线程同步问题
*

private static readonly T Instance = (T)Activator.CreateInstance(typeof(T), true);

public static T GetInstance()
{
return Instance;
}
*/
#endregion

#region 实现三

/*
* 单线程测试通过!
* 多线程测试通过!
*主动实例化单例类!
* 注:使用静态初始化的话,无需显示地编写线程安全代码,C# 与 CLR 会自动解决多线程同步问题

MySingleton() { }
public static T GetInstance()
{
return SingletonCreator.Instance;
}

class SingletonCreator
{
static SingletonCreator() { }
internal static readonly T Instance = (T)Activator.CreateInstance(typeof(T), true);// new T();
}
*
*/
/*内部类
* 创建内部类的一个目的是为了抽象外部类的某一状态下的行为,
* 或者C#内部类仅在外部类的某一特定上下文存在。或是隐藏实现,
* 通过将内部类设为private,可以设置仅有外部类可以访问该类。
* 内部类的另外一个重要的用途是当外部类需要作为某个特定的类工作,
* 而外部类已经继承与另外一个类的时候,因为C#不支持多继承,
* 所以创建一个对应的内部类作为外部类的一个facade来使用。
*/
#endregion

}
}

测试:

 

测试
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsoleSingletonTest
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
var thread = new Thread(new ThreadStart(Run));
thread.Start();
}
Console.Read();
}
public static void Run()
{
Console.WriteLine(MySingleton<MyJob>.GetInstance().Write());
}
}
public class MyJob
{
private string _timeSpan;

private MyJob()
{
_timeSpan = DateTime.Now.Millisecond.ToString();
}
public string Write()
{
Debug.WriteLine(_timeSpan);
return _timeSpan;
}
}
}

 



posted @ 2011-10-27 17:43  汤包  阅读(5649)  评论(1编辑  收藏  举报