实用的泛型Singleton类

Singleton模式是最常的设计模式之一,我们会经常写这类代码.因其基本原理就是保存一个静态的对象实例,所以我们便能利用泛型写出一个通用的Singleton类.

代码很简单:

public class Singleton<T>
  ...{
    static readonly T _t;
    static Singleton()
    ...{
      _t = Construct();
    }
    public static T GetInstance()
    ...{
      return _t;
    }
    private static T Construct()
    ...{
      Type type = typeof(T);
      ConstructorInfo ctor;
      ctor = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
                    null, new Type[0], new ParameterModifier[0]);
      System.Diagnostics.Debug.Assert(ctor != null, "Error in ENLS.Basic.Singleton.Construct().");
      return (T)ctor.Invoke(new object[0]);
    }
  }

因为特化的泛型类是不同的类型,Singleton<Tuple<int>>和Singleton<Tuple<int,long>>不同,所以这两个类中的_t是不同的静态实例.然后在Construct方法中通过反射调用共有或私有的默认构造参数来创建新实例.为什么会有public的构造函数呢,这是为了使用NullObject模式.比如为了方便我要给Tuple基类添加一个方法用来的到空对象

public static Tuple GetNullInstance<_Tuple>() where _Tuple: Tuple
{
   return Singleton<_Tuple>.GetInstance();
}
有了这个空对象我就可以更简单的使用前面文章中介绍的遍历控件的函数.

public IEnumerable<Control> Iterator<_Tuple>(Control baseCtl) where _Tuple : Tuple
    ...{
      Tuple tuple = Tuple.GetNullInstance<_Tuple>();
      foreach(Control c in baseCtl.Controls)
      ...{
        if (!tuple.HasType(c))
        ...{
          foreach (Control c1 in Iterator<_Tuple>(c))
            yield return c1;
        }
        else
          yield return c;
      }
    }

这样就可以很方便的调用了

foreach (Control c in this.Iterator<Tuple<TextBox, TreeView, CheckBox>>(this))
        MessageBox.Show(c.Name);

时间: 2024-11-03 01:57:44

实用的泛型Singleton类的相关文章

构建可反转排序的泛型字典类(1)--雏形

构建可反转排序的泛型字典类 前言 前段时间为了查找泛型资料,我翻译了O'Reilly 出版的<C# Cookbook>这本书的几个关于泛型的章节.其中"4.8 反转Sorted List里的内容"(见 http://cgbluesky.blog.163.com/blog/static/2412355820081211016581/ )这一节中有一个接近1300行代码的例子.当时看到这个例子吓了一跳,这是一个足以让人头晕眼花的数字.粗略看了一下,感觉代码质量非常高,非常值得我

绑定子类的泛型基类,反模式?

 这次总结一个个人认为的反模式:"绑定子类的泛型层基类",这个模式在一些著名的框架中也见到过,如果CSLA.BlogEngine.我自己在原来的写的框架中,也用到过.     当然了,个人认为是反模式,各们同仁并不一定这样认为,仁者见仁,智者见智了.不过我好几次都是受尽折磨,所以决定写出来给大家分享下心得.   模式介绍     "层基类"是MF提出的一个基本模式,详见:<Layer Supertype>.这种模式在经典的层次型架构设计的实现中,是极其重

问一个Java泛型与类继承的问题

问题描述 问一个Java泛型与类继承的问题 直接上代码了 //DeviceRepository类 public abstract class DeviceRepository<T extends Device> extends DomainRepository<T> //DeviceEventHandler类第一种写法 public abstract class DeviceEventHandler<M extends Device,R extends DeviceRepos

java泛型 原生类 赋值时

问题描述 java泛型 原生类 赋值时 class Fruit { } public class Test { public static void main(String[] args) { List list1 = new ArrayList(); //list list2 = new ArrayList(); } list2报错我是知道的,但是我不明白list1作为原生类为什么可以被赋值为ArrayList呢? 解决方案 List是接口,不是原生类. 解决方案二: Java中的泛型方法 解

C++实现的泛型List类分享_C 语言

额,不要说我三心二意:一边在看.NET和CLR的原理.一边在看JavaScript.一边在看Java:有时看算法有时看Unity.Hibernate:有时看Hadoop有时看Redis:现在又开始看C++了. 以前觉得无论什么语言嘛,其实都差不多,核心思想基本一致.现在又不这么想了,其实语言的选择对软件的性能.可靠性.开发成本之类的关系很大,所以觉得还是要多接触一些比较核心的东西--那么自然是C++了.以前在学校学的C++完全是酱油,太水了基本没啥用,用来用去和C差不多,所以现在要自己学啦. 废

得到singleton类?

在Ruby中,无论类或者对象,都有一个singlton类(或者称为metaclass),有兴趣的话读读过去写的这篇<Ruby的对象模型>.当我们获取某个类或者对象的class属性时,其实会忽略c ruby层次上的singleton类,那么我们如何得到singleton类呢?比较有趣的做法: singletonclass=class<<Test;self;end 对于对象,也是如此: test=Test.new metaclass=class<<test;self;end

一个简洁实用的PHP缓存类完整实例_php技巧

本文完整描述了一个简洁实用的PHP缓存类,可用来检查缓存文件是否在设置更新时间之内.清除缓存文件.根据当前动态文件生成缓存文件名.连续创建目录.缓存文件输出静态等功能.对于采用PHP开发CMS系统来说,离不开对缓存的处理,合理利用好缓存可有效的提高程序执行效率. php缓存类文件完整代码如下: <?php /* * 缓存类 cache */ class cache { //缓存目录 var $cacheRoot = "./cache/"; //缓存更新时间秒数,0为不缓存 var

简单实用的Xml解析类

今天有点郁闷,不想干活.整理代码的时候,看到了这个好久之前写的代码,于是想整理 出来供大家拍砖.XML的解析对于.Net平台那真是太简单不过了,感谢微软.但对于C++语言 的XML解析就没那么容易了.有一个开源的XML4C是IBM的,功能强大,但代码大的有几M,而且 对于GB2312的支持有问题,据说能解决,但可能是我天生愚钝,当初我花了2周时间也没搞定 ,最后放弃,自己写了一个.咦?还能跑起来,也能跨平台:). 写这个XML解析类,以功能 最简单,最实用,最常用的功能为原则,因为只能解析,查找

构建可反转排序的泛型字典类(7)--实现IDictionary接口

7. 实现IDictionary接口 前面做了很多努力,现在终于可以实现 IDictionary接口了.当然,之所以要先实现它,目的之一还是为了之前留下的 一点遗憾:在foreach中使用DictionaryEntry访问集合中的元素. 需要 注意,由于ReversibleSortedList类最主要的接口是泛型IDictionary接口,实 现非泛型IDictionary接口主要是考虑到兼容性,试想,你的项目是用.NET 1.0 实现的,但现在你需要使用.NET 2.0继续完善程序并使用到了一