设计模式创建型模式之单例模式(代码片段)

yheng yheng     2022-12-01     243

关键词:

单例模式

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。

简单的理解:保证这一个类仅有一个实例,并提供一个访问它的全局访问点。

通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。

实现思路

  1. 将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例【Lazy Singleton(懒汉式单例类)】
  2. 在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用【Eager Singleton(饿汉式单例类)】

单例模式特点

  1. 单例类只能有一个实例
  2. 单例类必须自己创建自己的唯一实例
  3. 单例类必须给所有其他对象提供这一实例

单例模式的几种实现方式

1.Lazy Singleton(懒汉式单例类)

其类的唯一实例在真正调用时才被创建,而不是类加载时就被创建。所以Lazy Singleton不是线程安全的。

这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。所以严格意义上它并不算单例模式。
这种方式 lazy loading 很明显,不要求线程安全,在多线程不能正常工作。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace _21单例模式01
 8 
 9     class Program
10     
11         static void Main(string[] args)
12         
13             Singleton s1 = Singleton.GetInstance();
14             Singleton s2 = Singleton.GetInstance();
15             if (s1 == s2)
16             
17                 Console.WriteLine("两个对象是相同的实例。");
18             
19             Console.Read();
20         
21     
22     class Singleton
23     
24         private static Singleton instance;
25         private Singleton()
26         
27 
28         
29         public static Singleton GetInstance()
30         
31             if (instance == null)
32             
33                 instance = new Singleton();
34             
35             return instance;
36         
37     
38 

 

2.懒汉式(双锁保证线程安全)

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace _21单例模式_多线程单例_
 8 
 9     class Program
10     
11         static void Main(string[] args)
12         
13         
14     
15 
16     class Singleton
17     
18         private static Singleton instance;
19         private static readonly object syncRoot = new object();
20         private Singleton()
21         
22 
23         
24 
25         //双重锁定
26         //为什么会有两个 instance==null
27         /*
28         两个线程同时访问第一阶段:instance,大家得到的都是null
29         然后由lock机制,两个线程只有一个进入,而另外一个线程需要等待
30         当第一个线程完成后,第二个线程则进入,如果不加判断,第二个线程也会在 new 一次
31         */
32         public static Singleton GetInstance()
33         
34             if (instance == null)
35             
36                 lock (syncRoot)
37                 
38                     if (instance == null)
39                     
40                         instance = new Singleton();
41                     
42                 
43             
44             return instance;
45         
46     
47 

 

3.Eager Singleton(饿汉式单例类)

其静态成员在类加载时就被初始化,此时类的私有构造函数被调用,单例类的唯一实例就被创建

 1 class EagerSingleton
 2 
 3     private static readonly EagerSingleton instance = new EagerSingleton();
 4 
 5     private EagerSingleton()  
 6 
 7     public static EagerSingleton GetInstance()
 8     
 9         return instance;
10     
11 

 

两者之间的区别

饿汉式:即静态初始化的方式,它是类一加载就实例化的对象,所以要提前占用系统资源。

懒汉式:面临这多线程访问的安全性问题。需要做双重锁定这样的处理才可以保证安全。

优点

1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例

2、避免对资源的多重占用

缺点:

没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new,可能会给其他开发人员造成困扰,特别是看不到源码的时候。

单例模式与静态类区别

单例可以继承类,实现接口,而静态类不能
单例可以被延迟初始化,静态类一般在第一次加载是初始化
静态类占资源,不断初始化和释放

设计模式创建型模式之单例模式(代码片段)

单例模式单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。简单的理解:保证这一个类... 查看详情

创建型设计模式之单例设计模式(代码片段)

...的回收站也是。4.数据库的连接池设计,一般也采用单例设计模式,数据库连接是一种数据库资源。在数据库软件系统中使用数据库连接池,可以节省打开或关闭数据库连接引起的效率损耗,用单例模式维护,就可以大大降低这种... 查看详情

设计模式之单例模式(代码片段)

设计模式(Designpattern),提供了在软件开发过程中面临的一些问题的最佳解决方案,是开发者必修的一门课程。主要分创建型模式、结构型模式和行为型模式。其中接下来我们要写的是单例模式,属于创建型模式。文章目录0x01... 查看详情

设计模式之单例模式(代码片段)

1背景回顾设计模式是一种思维方式,前人总结的最佳实践,也是一种态度,一种进步。软件过程里面设计模式一共有23种,一般分为3类。即创建型,结构性型,行为型。其中:**创建型5种:**解决... 查看详情

javascript设计模式--创建型设计模式之单例模式(代码片段)

         JAVASCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVASCRIPT语言来实现主体功能,所以不可能像C++,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVASCRIPT代码,代码只是实现了... 查看详情

设计模式创建型模式之单例设计模式(代码片段)

【设计模式】创建型模式之单例设计模式文章目录【设计模式】创建型模式之单例设计模式1.概述2.结构3.实现3.1饿汉式:静态变量方式实现3.2饿汉式:静态代码块方式实现3.3饿汉式:枚举方式实现(推荐)3.4懒汉式:... 查看详情

创建型模式之单例模式(代码片段)

一、介绍类的单例设计模式,就是采用一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。二、单例模式八种方式饿汉式(静态常量)饿汉式(静态代... 查看详情

设计模式之单例模式(代码片段)

单例模式(SingletonPattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。作用(解决的问题):保证1个类只有1个对象,降... 查看详情

gof23设计模式之单例模式(代码片段)

GOF23设计模式(GroupOfFour)为国外很有名的四个大牛总结的23总常见的套路分类:1)创建型模式单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式2)结构型模式适配器模式、桥接模式、装饰模式、组合模式、外观模式... 查看详情

创建型模式之单例模式

packagetest;publicclassSingletonDemo1 /*单例模式饿汉模式 **/ //类初始化时,立即加载这个对象,线程安全。缺点不能延迟加载 privatestaticSingletonDemo1st=newSingletonDemo1(); privateSingletonDemo1() //方法没有同步,调用效率高 publicstaticSingletonD 查看详情

揭秘设计模式之单例模式(代码片段)

什么是单例模式单例模式是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。属于创建型模式。单例就是一个类只能有一个对象,单例模式在生活里也比较普遍,比如:像打印机、处理器(单核)、皇... 查看详情

创建型设计模式之单例模式

《研磨设计模式》中的定义:保证一个类仅有一个实例,并提供它的一个全局访问点。而单例模式的本质便是——控制实例数目。一、介绍1、单例模式和静态方法区别简单的一个懒汉式单例模式publicclassEagerSingletonprivatestat... 查看详情

设计模式之单例模式(代码片段)

“学习的路上没有捷径,我是这样认为的...” 定义:确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。所以需要隐藏构造方法。属于创建型模式【有待查阅】 单例模式有点:  1.内存中只... 查看详情

java设计模式之单例模式(代码片段)

...一个实例,并提供一个全局访问点,属于创建型设计模式应用场景:需要频繁的创建一些类,使用单例模式可以降低系统的内存压力,减少GC某些类创建实例时占用资源比较多,或实例化耗时较长,且... 查看详情

软件设计模式之单例模式(代码片段)

设计模式之单例模式定义保证一个类仅有一个实例,并提供一个全局访问点类型创建型使用场景想确保任何情况下都绝对只有一个实例优点在内存里只有一个实例,减少了内存开销。可以避免对资源的多重占用。设置全局访问点... 查看详情

设计模式之单例模式(代码片段)

...      单例模式属于创建型模式,是设计模式中最简单的设计模式之一,其最大的特点是只有一个实例。当某一个类频繁被其他对象进行调用,为减少该类被频繁的创建和销毁,单例模式则派上用场。 &nb... 查看详情

设计模式之单例模式详解(java)(代码片段)

目录一、单例模式1.1饿汉式1.2懒汉式1.3DCL懒汉式(双重检验锁)1.4静态内部类1.5枚举一、单例模式单例模式的实现方式有许多种,重点是以下五种:饿汉式、懒汉式、双重校验锁(DCL懒汉式)、静态内部类... 查看详情

设计模式之单例模式(代码片段)

单例模式一、什么是单例模式?创建一个类二、实现方式2.1饿汉式1publicclassSingleton2privatestaticSingletonINSTANCE=newSingleton();34privateSingleton()56publicstaticSingletongetInstance()7returnINSTANCE;89  查看详情