分享

单例模式的泛型实现 C#

 ThinkTank_引擎 2016-11-22

当开发人员想将一个类以单例模式实现时,可以在类中写单例模式的代码实现。

当时如果项目中存在多个单例模式的类时,我们可以采取每个类都写的方式。

但是更聪明的方法是采取单例模式的泛型实现。

以下是一个简单的控制台泛型单例模式的例子。


1.泛型单例类

[csharp] view plain copy
  1. class Singleton<T> where T: class,new()  
  2. {  
  3.     private static T _instance;  
  4.     private static readonly object syslock=new object();  
  5.   
  6.     public static T getInstance() {  
  7.         if (_instance == null)  
  8.         {  
  9.             lock (syslock) {  
  10.                 if (_instance == null)  
  11.                 {  
  12.                     _instance = new T();  
  13.                     return _instance;  
  14.                 }  
  15.                 else {  
  16.                     return _instance;  
  17.                 }  
  18.             }  
  19.         }  
  20.         else {  
  21.             return _instance;  
  22.         }  
  23.     }  
  24. }  

后优化为

[csharp] view plain copy
在CODE上查看代码片派生到我的代码片
  1. class Singleton<T> where T: class,new()  
  2. {  
  3.     private static T _instance;  
  4.     private static readonly object syslock=new object();  
  5.   
  6.     public static T getInstance()   
  7.     {  
  8.         if (_instance == null)  
  9.         {  
  10.             lock (syslock) {  
  11.                 if (_instance == null)  
  12.                 {  
  13.                     _instance = new T();  
  14.                 }  
  15.             }  
  16.         }  
  17.        return _instance;  
  18.     }  
  19. }  



2.1.譬如我们自己有一个类myclass,继承上述类即可实现单例化

[csharp] view plain copy
在CODE上查看代码片派生到我的代码片
  1. class myclass : Singleton<myclass> {  
  2.     public void ss() {  
  3.         Console.WriteLine("111");  
  4.     }  
  5. }  

main函数中调用实现:

[csharp] view plain copy
在CODE上查看代码片派生到我的代码片
  1. myclass.getInstance().ss();  

2.1继承太奢侈了,毕竟一个类只能继承一次,还有另一种方式实现单例化

同样自己有一个类myclass2

[csharp] view plain copy
在CODE上查看代码片派生到我的代码片
  1. class myclass2 {  
  2.     public static myclass2 getInstance() {  
  3.         return Singleton<myclass2>.getInstance();  
  4.     }  
  5.     public void ss()  
  6.     {  
  7.         Console.WriteLine("111");  
  8.     }  
  9. }  

main函数中调用同2.1


相关链接:http://www.cnblogs.com/jianglai11/archive/2011/10/27/2226881.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多