文档章节

单例模式泛型类

开源中国123456789
 开源中国123456789
发布于 2016/11/13 00:15
字数 399
阅读 20
收藏 1

最理想的非泛型实现:

/// <summary>
    /// 单例模式的实现
    /// </summary>
    public class Singleton
    {
        // 定义一个静态变量来保存类的实例
        private static Singleton uniqueInstance;

        // 定义一个标识确保线程同步
        private static readonly object locker = new object();

        // 定义私有构造函数,使外界不能创建该类实例
        private Singleton()
        {
        }

        /// <summary>
        /// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点
        /// </summary>
        /// <returns></returns>
        public static Singleton GetInstance()
        {
            // 当第一个线程运行到这里时,此时会对locker对象 "加锁",
            // 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁
            // lock语句运行完之后(即线程运行完之后)会对该对象"解锁"
            if(uniqueInstance ==null){ //双层if将性能开销降到最低
            lock (locker)
            {
                // 如果类的实例不存在则创建,否则直接返回
                if (uniqueInstance == null)
                {
                    uniqueInstance = new Singleton();
                }
            }
            }
            return uniqueInstance;
        }
    }
/// <summary>
    /// 单例模式泛型类
    /// </summary>
    /// <typeparam name="T">类</typeparam>
    public abstract class Singleton<T> where T : class
    {
        private static T _Instance;
        private static readonly object Locker = new object();

        public static T GetInstance()
        {
            if (_Instance == null)
            {
                lock (Locker)
                {
                    if (_Instance == null)
                    {
                        _Instance = (T) Activator.CreateInstance(typeof(T), true);
                    }
                }
            }
            return _Instance;
        }
    }

调用:

public class MySingleton : Singleton<MySingleton>
  { 
      public void IncrementCounter()
      { 
          Console.WriteLine(11111111111111);
      }
  }



static void Main(string[] args)
      {

          for (int j = 0; j < 1000; ++j)
              MySingleton.GetInstance().IncrementCounter();
           
          Console.ReadLine();
      }

以上泛型可以是where T:new() , 但是实现类必须得是共有的构造函数

当然也可以用lazy

  public abstract class Singleton<T> where T : class 
    {
        private  static Lazy<T> _instance = new Lazy<T>(() => (T)Activator.CreateInstance(typeof(T), true));
      
        public static T Instance
        {
            get
            {
                return _instance.Value;
            }
        } 
    }

© 著作权归作者所有

下一篇: C#深拷贝
开源中国123456789
粉丝 7
博文 77
码字总数 66184
作品 0
海淀
私信 提问
前端设计模式(1)--工厂模式

写在前面 设计模式有23种,按大类归类的话可以分为三大类:创建型(如:工厂模式、单例模式、原型模式等),结构型模式(如装饰器模式、代理模式等),行为型(如:观察者模式、迭代器模式等...

duffy
02/01
0
0
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
228
2
学了那么多年设计模式依然不会用!那可真蠢!

什么是设计模式? 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决...

GitChat技术杂谈
2018/10/26
0
0
设计模式Java Design Pattern-工厂方法模式FactoryMethod

我的博客 一、 设计模式的分类 大体可以分为三类: 创建型模式(5个) 单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式 结构性模式(7个) 适配器模式、装饰器模式、代理模式、...

勇敢写信
2018/03/22
0
0
设计模式之抽象工厂模式(创建型)

模式定义 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。 模式角色 抽象...

smileNicky
01/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

系列一、入门教程web端实现地图功能

废话不多说,社会我多多 实现步骤如下 第一步、在高德api注册账户 搜索高德api点击进入官网,自己注册一个账号,你懂得怎么注册撒 点击进入下图画框位置,来到官网api入门教程 第二步、按照以...

我叫小糖主
18分钟前
4
0
springboot统一校验validator实现

第一步: pom.xml需引入spring-boot-start-web依赖,其中包含validator框架包 <!--Spring Boot Web依赖--><dependency> <groupId>org.springframework.boot</groupId> <artifact......

zzx10
20分钟前
1
0
vue组件系列-预览、放大、缩小、旋转

这个用的是别人的,如果有问题,估计改起来会很纠结。 安装 npm install v-viewer --save 卸载 npm uninstall v-viewer 注册 在main.js中 // The Vue build version to load with the `impor...

轻轻的走过
21分钟前
1
0
Taro Input输入内容无法绑定state问题

在onInput事件中,返回内容,返回内容即是输入框内容 例如只能输入一个小数点: <Input type='digit' placeholder='带小数点的数字键盘' value={this.state.advance} onInput={ e => this.ch......

步步登高
23分钟前
0
0
Windows10远程连接CentOS7(搭建Xrdp服务器)

Windows10远程连接CentOS7(搭建Xrdp服务器) 听语音 浏览:0 | 更新:2018-02-11 12:56 1 2 3 4 5 6 7 分步阅读 通过VNC或Xdmcp的方式远程连接linux图形桌面,虽然都很方便,但有个缺点就是...

linjin200
23分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部