使用C# 2.0泛型实现单例模式重用

  介绍

  很多有着不同开发背景得人都会比较熟悉单例模式。他们会发现每次他们要创建一个不同的单例类的时候,都不得不写同样得代码。使用新的C# 2.0的泛型,可以实现只写一次同样得代码。

  使用 C# 2.0 泛型来完成单例模式的重用

  使用 C# 2.0 的泛型,使得实现我所说的"单例提供者"成为可能。这是一个可用来创建单例类实例确不需要为每个特定的类重写单例模式代码的可重用的类。这样分离出单例结构的代码,将有利于保持按单例模式使用类或不按单例模式使用类的灵活性。

public sealed class Singleton
{
 Singleton()
 {}

 public static Singleton Instance
 {
  get
  {
   return SingletonCreator.instance;
  }
 }

 class SingletonCreator
 {
  // Explicit static constructor to tell C# compiler
  // not to mark type as beforefieldinit
  static Nested()
  {}

  internal static readonly Singleton instance = new Singleton();
 }
}
  基于对泛型的了解,你可以发现没有理由不在这段代码里替换类型参数为泛型里典型的'T'。如果这样做,这段代码就变成下面这样。

public class SingletonProvider<T> where T : new()
{
 SingletonProvider() { }

 public static T Instance
 {
  get { return SingletonCreator.instance; }
 }

 class SingletonCreator
 {
  static SingletonCreator() { }
  internal static readonly T instance = new T();
 }
}
  注意在这里使用了泛型的约束。这个约束强制任何类型'T'都必须具有无参数的公共构造函数。这里允许singletonCreator类来实例化类型'T'。

  那么,要怎么样来使用单例提供者呢?为了弄清除如何使用它,我们需要写一个测试类。这个测试类有两个部分。第一部分是一个默认的构造函数,用来设置timestamp变量的值。第二部分是一个公共函数,用来实现用"Debug.WriteLine"来输出timestamp的值。这个测试类的意思就是不论那个线程在任何时候,在单例下调用这个类公共方法,都将返回相同的值。

public class TestClass
{
 private string _createdTimestamp;

 public TestClass ()
 {
  _createdTimestamp = DateTime.Now.ToString();
 }

 public void Write()
 {
  Debug.WriteLine(_createdTimestamp);
 }
}
  这个类就像下面这样使用单例提供者:

SingletonProvider<TestClass>.Instance.Write();
  关注点

  我已经在一个超线程的双处理器上使用100个线程在单态模式下进行了测试。所有线程都返回相同的值,这说明这是一个线程安全的使用泛型来实现的单态模式。 我相信这已经充分说明了泛型怎么帮助你简化代码。

时间: 2024-12-31 02:27:13

使用C# 2.0泛型实现单例模式重用的相关文章

.NET2.0泛型的“近距离”实践

早闻.NET 2.0中泛型的大名,但一直未在实际开发中使用.最近在开发公司项目程序的过程中体验了一下. 应用场景: 在配置文件中通过反序列化读取相应的邮件设置. 配置文件示例: <BlogConfigurationSettings><MailSettings><MailSetting Name="ApproveEmail" SmtpServer="smtp.126.com" EmailFrom="" UserName

.NET 2.0 泛型在实际开发中的一次小应用

早闻.NET 2.0中泛型的大名,但一直未在实际开发中使用. 最近在开发博客园网站程序的过程中体验了一下. 应用场景: 在配置文件中通过反序列化读取相应的邮件设置. 配置文件示例: <BlogConfigurationSettings><MailSettings>      <MailSetting Name="ApproveEmail" SmtpServer="smtp.126.com" EmailFrom=""

swift-Swift 2.0泛型例子解答

问题描述 Swift 2.0泛型例子解答 func anyCommonElements (lhs: T, _ rhs: U) -> Bool { for lhsItem in lhs { for rhsItem in rhs { if lhsItem == rhsItem { return true } } } return false } anyCommonElements([1, 2, 3], [3]) 练习: 修改anyCommonElements(_:_:)函数来创建一个函数,返回一个数

C# 2.0 - 泛型(Generics)

除非必要,否则请不要使用泛型(Generics)!滥用泛型只会增加代码的复杂性. 有如"Hello, World!"一样,说到泛型必定从Stack说起,先看看. public class Stack <T>{  public void Push(T item)  {...}   public T Pop()  {...}} Stack<int> stack = new Stack<T>();stack.Push(12);int i = stack.P

【java设计模式初探0】_单例模式

在java的几十种设计模式中,可能单例模式算是最容易理解的吧!因为不论是目前的我自己,还是偶尔面试的别人,能稍微讲清楚的,基本就是单例模式.什么叫单例模式?顾名思义,就是单一的实例,唯一的实例.也就是说对于某个java类来说,他的实例对象最多只能创建一个. 那么,稍微有点java基础的同学都知道,我们自己创建对象最基本的方式就是使用new关键字,通过类定义的构造器来创建.就比如有这样一个类: public class Earth{ public Earth(){ } } 我们自己创建该类的对象,

网络编程经验技巧:ASP.NET2.0泛型和匿名方法

asp.net|编程|技巧|网络 泛型: 泛型概述:泛型可应用于类.方法.结构.接口.委托等设计中,兼复用性.类型安全和高效率于一身是与之对就的非泛型所不及的应用泛型,必须使用类System.Collections.Generic.Stack.该类的声明方式如下: System.Collections.Generic.Stack (声明代码) 可以把Stack类想像成具有如下示意性处理过程: Stack类示意性代码: public class stack<> { T[] item; int c

C#2.0泛型学习--入门篇

     最近频繁的接触到泛型方面的问题,所以也不得不来学习一下了,开始主要是在MSDN的WebCast上去下载教学录象看的(李建忠老师的),本篇文章先介绍一下泛型入门方面的知识,希望能让刚开始学习泛型的朋友能够更快的入门,言归正传,首先我们来看一下泛型的基本概念:      最显著的一点就是它参数化了类型,把类型作为参数抽象出来,从而使我们在实际的运用当中能够更好的实现代码的重复利用,同时它提供了更强的类型安全,更高的效率,不过在约束方面,它只支持显示的约束,这样在灵活性方面就显得不是那么好了

ASP.NET 2.0泛型和匿名方法

泛型: 泛型概述:泛型可应用于类.方法.结构.接口.委托等设计中,兼复用性.类型安全和高效率于一身是与之对就的非泛型所不及的应用泛型,必须使用类System.Collections.Generic.Stack.该类的声明方式如下: System.Collections.Generic.Stack (声明代码) 可以把Stack类想像成具有如下示意性处理过程: Stack类示意性代码: public class stack<> { T[] item; int count; public void

C# 2.0教程专题

Visual C# 2010新特性之dynamic类型 Visual C# 2010新特性之命名和可选参数与类型等价支持 C# 2.0教程专题 用Visual C# 2005创建快捷方式 用VC#2005解析含有多种格式的文本文件 利用VC# 2005为数码照片添加拍照日期 VC#2005快速入门之使用布尔操作符 VC#2005快速入门之使用while语句 Effective C#原则49:为C#2.0做好准备 VC#2005快速入门之使用if语句 VC#2005快速入门之使用do语句 VC#2