原文标题:Generic Singleton Provider
原文地址:http://www.codeproject.com/csharp/genericsingleton.asp

介绍

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

背景

已经有很多文章介绍过单例模式,也许最完整的一个C#版本在这里可以找到:"Implementing the Singleton Pattern in C#"。
也有越来越多介绍C#泛型得文章。例如,一篇由CodeProject的Ansil所写的文章可以在这里找到:"Generics in C# 2.0" 。

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

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

在这里使用的单例的代码是基于文章上面提到过的"Implementing the Singleton Pattern in C#"文章里的第五个版本实现的。

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个线程在单态模式下进行了测试。所有线程都返回相同的值,这说明这是一个线程安全的使用泛型来实现的单态模式。

我相信这已经充分说明了泛型怎么帮助你简化代码。

历史

略。

转载于:https://www.cnblogs.com/justinw/archive/2006/05/07/393076.html

使用泛型实现单例提供者(原创翻译)相关推荐

  1. 2020-10-23 集合+序列化+递归+多线程+泛型+枚举+单例+反射小记

    [集合]: Collection接口 (Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类.但是却让其被继承产生了两个接口,就是Set和List) Set接口(无序集合 ...

  2. Unity 泛型单例

    单例类 public abstract class Singleton<T> where T:class, new() {private static T mInstance;public ...

  3. 如何自动生成推荐歌单:ACM论文翻译与解读 | Translation and Interpretation of ACM Survey

    如何自动生成推荐歌单:ACM论文翻译与解读 | How to Automatically Generate Music Playlists: Translation and Interpretatio ...

  4. Swift中编写单例的正确方式

    本文由CocoaChina译者leon(社区ID)翻译自krakendev 原文:THE RIGHT WAY TO WRITE A SINGLETON 转载请保持所有内容和链接的完整性. 在之前的帖子 ...

  5. 学会放下包袱,热爱单例

    企业应用程序与移动应用程序有着截然不同的要求.你启动一次企业应用程序,它会连续运行数月或数年.另一方面,大部分手机应用可能是被正在无聊排队或者坐公交车的用户启动的,它们经常连续运行不超过几分钟,这就意 ...

  6. 大叔手记(10):别再让面试官问你单例

    大叔手记(10):别再让面试官问你单例(暨6种实现方式让你堵住面试官的嘴) ... 2012-2-19 09:03| 发布者: benben| 查看: 283| 评论: 0 摘要: 引子经常从Recr ...

  7. 序列化和反序列化的对单例破坏的防止及其原理

    首先我们来看一下序列化和反序列化是怎么破坏单例的.看代码 public class HungrySingleton implements Serializable{private final stat ...

  8. 回字有四种写法,那你知道单例有五种写法吗

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 转自 ...

  9. Spring 为啥默认把 bean 设计成单例的?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:在滴滴和头条干了 2 年后端开发,太真实-个人原创100W+访问量博客:点击前往,查看更多 熟悉Spring开发 ...

最新文章

  1. win10蓝屏问题,关于驱动kisSaasUrlRedirectKnl64.sys 的
  2. hihoCoder 1578 Visiting Peking University 【贪心】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)...
  3. spring系列-注解驱动原理及源码-spring容器创建流程
  4. Linux监控   Nagios
  5. 【爬蟲】使用 httpclient进行get请求
  6. TiDB 在金融关键业务场景的实践
  7. 已知两点坐标如何快速增加其他坐标_从0开发工程测绘大师小程序之坐标正算篇(十一)...
  8. stopped状态的进程 top 命令_Linux 进程管理之四大名捕
  9. ArcMAP 设置图层透明度
  10. java需要了解的几个算法
  11. redis 字符串类型命令
  12. 企业应用网站性能优化实例分析
  13. 收集最全的工业软件大集合
  14. wps for linux字体缺失,wps for linux 字体库缺失问题的解决办法
  15. rogabet notepad 浏览器调用
  16. 6 Transport
  17. 香侬专栏 | 独家对话斯坦福大学计算机系教授Percy Liang
  18. 视频直播系统源码,平台在日间和夜间模式之间来回切换
  19. 测试环境搭建-5:设备的驱动程序未被安装解决方法
  20. Ubuntu系统在终端查看一些软硬件版本或文件大小的指令!

热门文章

  1. SetTimer和KillTimer详解
  2. Visual C#实现HTTP代理服务程序
  3. GoogLeNet系列解读
  4. oracle数据库多表联查并排序,oracle数据库之多表联接查询(一)
  5. html如何复用其它页面,编写可以复用的 HTML 模板
  6. 事态升级是什么意思_第602期搞笑gif动图:不好意思,腿太长了,来个歪打正着...
  7. powerdesigner显示工具面板_10分钟看懂Photoshop 绘画(画笔面板1-3)
  8. poco c++ 开发指南_掌握这个框架,你将会开发通杀全平台的万能爬虫
  9. 设置LD_LIBRARY_PATH不起作用解决
  10. rpm mysql 指定目录_rpm 安装并配置MySQL(包含指定数据存储路径)