第一:单例模式

第一,单例模式是什么?

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

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

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

第一,单例模式是什么?

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

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

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

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

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

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

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

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

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

  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)控制资源的情况下,方便资源之间的互相通信。如线程池等。

   

时间: 2024-10-13 10:41:26

第一:单例模式的相关文章

设计模式第一讲:单例模式(IBM开发者论坛已经发表的文章)

单例模式 首先我们来讲一个故事.二次世界大战的时候,我国有一个著名的战役叫"长沙保卫战",中国军队指挥官薛岳将军率领第 9 战区十余万将士,通过所谓的"焦土"战术 4 次瓦解日军的大规模进攻,给对当时的国民党政府打了一针强心剂.这四次战役中最让人我难忘的一幕是,面对单兵战斗力是中国军队 5 倍的日军,人数上虽然占据一定优势,但是只有第 10 军和第 74 军两只军队装备了现代化的军械,其余军队都是"汉阳造"的落后装备.薛将军命令第 10 军反复在

23种设计模式第一种(单例模式)

单例模式单例模式 ------------------------------------------------------------------------------------------------------- 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. -------------------------------------------------------------------------------------------------- 创建类模式

Java设计模式学习笔记,一:单例模式

开始学习Java的设计模式,因为做了很多年C语言,所以语言基础的学习很快,但是面向过程向面向对象的编程思想的转变还是需要耗费很多的代码量的.所有希望通过设计模式的学习,能更深入的学习. 把学习过程中的笔记,记录下来,只记干货. 第一部分:单例模式的内容 单例模式:类只能有一个实例. 类的特点:1.私有构造器:2.内部构造实例对象:3.对外提供获取唯一实例的public方法. 常见的单例模式实现有五种形式: 1.饿汉式. 2.懒汉式. 3.双重检查锁式. 4.静态内部类式. 5.枚举式. 以下分别

.Net 单例模式(Singleton)

每台计算机可以有若干个打印机,但只能有一个Printer Spooler, 以避免两个打印作业同时输出到打印机中.每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情况.每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用. 问题描述: 单例模式 Singleton Pattern 问题解决: (1)单例模式简介: Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点.这

设计模式之单例模式

单例模式是软件开发中非常普遍的一种模式.它的主要作用是确保系统中,始终只存在一个类的实例对象. 这样做的好处有两点: 1.对于需要频繁使用的对象,在每次使用时,如果都需要重新创建,并且这些对象的内容都是一样的.则不但提高了jvm的性能开销(堆中开辟新地址,同时降低GC效率等),同时还会降低代码的运行效率.倘若始终在堆中只存在唯一的一个实例对象.任何方法在使用时,均直接访问这个实例对象,则大大提高了系统的运行效率. 2.可以更好的维护对象,倘若系统中存在多个相同的实例对象,而一旦这些实例对象的属性

单例模式和工厂模式(百度文库)

模式中的单例模式分为:饿汉模式和懒汉模式. 顾名思义: 饿汉模式是对食物(Singleton)比较渴望的,所有一开始就new了一个来满足(食欲) 饿汉式: public class Singleton{   private static Singleton singleton = new Singleton ();   private Singleton (){}   public static  Singleton getInstance(){return singletion;}   } 饿

再谈谈java的单例模式

原来转载过一篇关于单例模式的博客 http://blog.csdn.net/u011700281/article/details/21951795 现在自己由于实现一些管理器(比如 mysq了连接的管理器,redis的连接管理器,以及config的连接管理器),经常用到单例模式,不过,公司内的单例模式的实现方法有很多,自己也跟着总结一下. 首先,为什么需要单例模式呢?比如,你需要获得一个mysql连接,你肯定希望所有mysql的连接池是被一个对象管理的,而不希望你从这个对象可以获得连接,从另一个

单例模式是设计模式中最简单的形式之一

单例模式是设计模式中最简单的形式之一.这一模式的目的是使得类的一个对象成为系统中的唯一实例.要实现这一点,可以从客户端对其进行实例化开始.因此需要用一种只允许生成对象类的唯一实例的机制,"阻止"所有想要生成对象的访问.使用工厂方法来限制实例化过程.这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义 意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 适用性: 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 当这个唯一实例应该是通过子

设计模式-单例模式(Singleton Pattren)

单例模式(Singleton Pattren):确保一个类只有一个实例,并提供一个全局访问点. 实现要点: 1. 私有化构造方法 2. 类的实例在类初始化的时候创建 3. 提供一个类方法,返回值为类的实例,其他类调用该方法获取到该类的实例 1. 常规实现(线程不安全): 1 public class Singleton1 { 2 private static Singleton1 instance; 3 4 private Singleton1() { 5 6 } 7 8 public stat