专栏首页wfaceboss1,单例模式

1,单例模式

第一,单例模式是什么?

第二,为什么要使用单例模式?

第三,怎样使用单例模式?

第四,单例模式的应用场景

第一,单例模式是什么?

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

显然单例模式的要点有三个:

一是某个类只能有一个实例;

二是它必须自行创建这个实例(当前类中创建);

三是它必须自行向整个系统提供这个实例(通过一个方法接口)。

第二,为什么要使用单例模式?    确保对象的唯一性          入手确保对象的唯一性呢????

单例模式可以控制单例数量;可以进行有意义的派生;对实例的创建有更自由的控制;

第三,怎样使用单例模式?

  通过一个实例来说明(控制台应用程序)(有如下几种方式:)

  1.  私有的静态变量(被调用类)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace SingletonPattern
{
    /// <summary>
    /// 私有化构造函数
    /// 私有的静态变量
    /// 一个静态的对象创建方法

    /// </summary>
    public class Singleton
    {
        private Singleton()//构造函数私有
        {
            Console.WriteLine("初始化了?但我只能被掉一次哦,线程id={0}",Thread.CurrentThread.ManagedThreadId);
        }

        private static Singleton _Singleton = null;

        private static object Singleton_Lock = new object();

        public static Singleton CreateInstance() //双null
        {
            if (_Singleton == null)//保证对象初始化之后的所有线程,不需要等待锁
            {
                Console.WriteLine("准备进入lock");
                lock (Singleton_Lock)//保证只有一个线程进去判断
                {
                    //Thread.Sleep(1000);
                    if (_Singleton == null)//保证对象为空才真的创建
                    {
                        _Singleton = new Singleton();
                    }
                }
            }
            return _Singleton;
        }
        public void Show()
        {
            Console.WriteLine("这里调用了{0}.Show", this.GetType().Name);
        }
    }
}

   调用类:  使用多线程的方式

  List<Task> taskList = new List<Task>();  //提供任务列表
            TaskFactory taskFactory = new TaskFactory();
            taskList.Add(taskFactory.StartNew(() =>
           {
               Singleton singleton = Singleton.CreateInstance();//外部不能实例化,只能内部实例化
               singleton.Show();
           }));
            Task.WaitAll(taskList.ToArray());//等待所有任务完成

2.静态构造函数:由CLR保证,在第一次使用这个类之前,调用而且只调用一次

被调用类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace SingletonPattern
{
    public class SingletonSecond
    {
        private SingletonSecond()
        {
          
            Console.WriteLine("{0}被构造,线程id={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId);
        }

        private static SingletonSecond _Singleton = null;

        /// <summary>
        /// 静态构造函数:由CLR保证,在第一次使用这个类之前,调用而且只调用一次
        /// </summary>
        static SingletonSecond()
        {
            _Singleton = new SingletonSecond();
        }
        public static SingletonSecond CreateInstance()
        {
            return _Singleton;
        }

        public void Show()
        {
            Console.WriteLine("这里调用了{0}.Show", this.GetType().Name);
        }

    }
}

3.静态变量:会在类型第一次使用的时候初始化,而且只初始化一次

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace SingletonPattern
{
    public class SingletonThird
    {
        private SingletonThird()
        {
          
            Console.WriteLine("{0}被构造,线程id={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId);
        }

        /// <summary>
        /// 静态变量:会在类型第一次使用的时候初始化,而且只初始化一次
        /// </summary>
        private static SingletonThird _Singleton = new SingletonThird();

        public static SingletonThird CreateInstance()
        {
            return _Singleton;
        }

        public void Show()
        {
            Console.WriteLine("这里调用了{0}.Show", this.GetType().Name);
        }

    }
}

4.global.asax中也可以写(英文是启动项)

第四,单例模式的应用场景

单例模式应用的场景一般发现在以下条件下:

  (1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。

  (2)控制资源的情况下,方便资源之间的互相通信。如线程池等。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用MVC实现登录功能

                      using System.Data.SqlClient;

    wfaceboss
  • 6.1 集合和映射--集合->底层基于二叉搜索树实现

    前言:在第5章的系列学习中,已经实现了关于二叉搜索树的相关操作,详情查看第5章即可。在本节中着重学习使用底层是我们已经封装好的二叉搜索树相关操作来实现一个基本的...

    wfaceboss
  • 分布式爬虫搭建系列 之二-----神器PyCharm的安装

    这里我们使用PyCharm作为开发工具,以下过程摘抄于:http://blog.csdn.net/qq_29883591/article/details/526...

    wfaceboss
  • 单例模式的八种写法

    单例模式作为日常开发中最常用的设计模式之一,是最基础的设计模式,也是最需要熟练掌握的设计模式。单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访...

    王金龙
  • .net中的认证(authentication)与授权(authorization)

    注:这篇文章主要给新手看的,老手们可能会觉得没啥营养,就请绕过吧。 “认证”与“授权”是几乎所有系统中都会涉及的概念,通俗点讲: 认证(authenticat...

    菩提树下的杨过
  • 教你做个手绘板小程序码

    话说上一条群发,我发了一个旅行青蛙相关的图,底部有个手绘的小程序码 ? 有些细心的同学惊奇第发现那个“”手绘“”的小程序码竟然是可以长按识别的,觉得特别神奇。 ...

    花叔
  • C#连接Sqlite

    SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌...

    lzugis
  • 手把手带你开发一款 IIS 模块后门

    记得之前看一篇 APT 组织的报告时偶然间看到过 IIS 模块后门然后在网上找了找了资料,想自己开发一款然后开发到一半因为一些事情就停止了很久,这次清理项目文件...

    信安之路
  • 深入源码探讨HashSet

    我们在工作中时常会用到HashSet,面试也有时候容易被问到,下面咱们就来聊聊HashSet。

    用户4143945
  • Hadoop(十一)Hadoop IO之序列化与比较功能实现详解

    前言   上一篇给大家介绍了Hadoop是怎么样保证数据的完整性的,并且使用Java程序来验证了会产生.crc的校验文件。这一篇给大家分享的是Hadoop的序列...

    用户1195962

扫码关注云+社区

领取腾讯云代金券