设计模式之单例模式--Singleton Pattern

一、 单例(Singleton)模式

单例模式的特点:

  • 单例类只能有一个实例。
  • 单例类必须自己创建自己的唯一实例。
  • 单例类必须给所有其它对象提供这一实例。

单例模式应用:

  • 每台计算机可以有若干个打印机,但只能有一个Printer Spooler,避免两个打印作业同时输出到打印机。
  • 一个具有自动编号主键的表可以有多个用户同时使用,但数据库中只能有一个地方分配下一个主键编号。否则会出现主键重复。


二、 Singleton模式的结构:

Singleton模式包含的角色只有一个,就是Singleton。Singleton拥有一个私有构造函数,确保用户无法通过new直接实例它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance方法负责检验并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。(关于线程问题以及C#所特有的Singleton将在后面详细论述)。


三、 程序举例:

该程序演示了Singleton的结构,本身不具有任何实际价值。

// Singleton pattern -- Structural example 
using System;

// "Singleton"
class Singleton
{
 // Fields
 private static Singleton instance;

 // Constructor
 protected Singleton() {}

 // Methods
 public static Singleton Instance()
 {
 // Uses "Lazy initialization"
 if( instance == null )
 instance = new Singleton();

 return instance;
 }
}

/// <summary>
/// Client test
/// </summary>
public class Client
{
   public static void Main()
   {
   // Constructor is protected -- cannot use new
   Singleton s1 = Singleton.Instance();
   Singleton s2 = Singleton.Instance();

   if( s1 == s2 )
   Console.WriteLine( "The same instance" );
   }
}

 



四、 在什么情形下使用单例模式:

使用Singleton模式有一个必要条件:在一个系统要求一个类只有一个实例时才应当使用单例模式。反过来,如果一个类可以有几个实例共存,就不要使用单例模式。

注意:

不要使用单例模式存取全局变量。这违背了单例模式的用意,最好放到对应类的静态成员中。

不要将数据库连接做成单例,因为一个系统可能会与数据库有多个连接,并且在有连接池的情况下,应当尽可能及时释放连接。Singleton模式由于使用静态成员存储类实例,所以可能会造成资源无法及时释放,带来问题。


五、 Singleton模式在实际系统中的实现

下面这段Singleton代码演示了负载均衡对象。在负载均衡模型中,有多台服务器可提供服务,任务分配器随机挑选一台服务器提供服务,以确保任务均衡(实际情况比这个复杂的多)。这里,任务分配实例只能有一个,负责挑选服务器并分配任务。

// Singleton pattern -- Real World example 

using System;
using System.Collections;
using System.Threading;

// "Singleton"
class LoadBalancer
{
   // Fields
   private static LoadBalancer balancer;
   private ArrayList servers = new ArrayList();
   private Random random = new Random();

   // Constructors (protected)
   protected LoadBalancer()
   {
     // List of available servers
     servers.Add( "ServerI" );
     servers.Add( "ServerII" );
     servers.Add( "ServerIII" );
     servers.Add( "ServerIV" );
     servers.Add( "ServerV" );
   }

   // Methods
   public static LoadBalancer GetLoadBalancer()
   {
     // Support multithreaded applications through
     // "Double checked locking" pattern which avoids
     // locking every time the method is invoked
     if( balancer == null )
     {
       // Only one thread can obtain a mutex
       Mutex mutex = new Mutex();
       mutex.WaitOne();

       if( balancer == null )
       balancer = new LoadBalancer();

       mutex.Close();
     }
     return balancer;
   }

   // Properties
   public string Server
   {
     get
   {
   // Simple, but effective random load balancer
   int r = random.Next( servers.Count );
   return servers[ r ].ToString();
   }
   }
}

/// <summary>
/// SingletonApp test
/// </summary>
///
public class SingletonApp
{
   public static void Main( string[] args )
   {
     LoadBalancer b1 = LoadBalancer.GetLoadBalancer();
     LoadBalancer b2 = LoadBalancer.GetLoadBalancer();
     LoadBalancer b3 = LoadBalancer.GetLoadBalancer();
     LoadBalancer b4 = LoadBalancer.GetLoadBalancer();

     // Same instance?
     if( (b1 == b2) && (b2 == b3) && (b3 == b4) )
     Console.WriteLine( "Same instance" );

     // Do the load balancing
     Console.WriteLine( b1.Server );
     Console.WriteLine( b2.Server );
     Console.WriteLine( b3.Server );
     Console.WriteLine( b4.Server );
   }
}

 



六、 C#中的Singleton模式

C#的独特语言特性决定了C#拥有实现Singleton模式的独特方法。这里不再赘述原因,给出几个结果:

方法一:

下面是利用.NET Framework平台优势实现Singleton模式的代码:

sealed class Singleton
{
   private Singleton();
   public static readonly Singleton Instance=new Singleton();
}

 

这使得代码减少了许多,同时也解决了线程问题带来的性能上损失。那么它又是怎样工作的呢?

注意到,Singleton类被声明为sealed,以此保证它自己不会被继承,其次没有了Instance的方法,将原来_instance成员变量变成public readonly,并在声明时被初始化。通过这些改变,我们确实得到了Singleton的模式,原因是在JIT的处理过程中,如果类中的static属性被任何方法使用时,.NET Framework将对这个属性进行初始化,于是在初始化Instance属性的同时Singleton类实例得以创建和装载。而私有的构造函数和readonly(只读)保证了Singleton不会被再次实例化,这正是Singleton设计模式的意图。
(摘自:http://www.cnblogs.com/huqingyu/archive/2004/07/09/22721.aspx )

不过这也带来了一些问题,比如无法继承,实例在程序一运行就被初始化,无法实现延迟初始化等。

详细情况可以参考微软MSDN文章:《Exploring the Singleton Design Pattern》

方法二:

既然方法一存在问题,我们还有其它办法。

 

public sealed class Singleton
{
   Singleton()
   {
   }

   public static Singleton GetInstance()
   {
     return Nested.instance;
   }
 
   class Nested
   {
   // Explicit static constructor to tell C# compiler
   // not to mark type as beforefieldinit
   static Nested()
   {
   }

   internal static readonly Singleton instance = new Singleton();
   }
}

 

这实现了延迟初始化,并具有很多优势,当然也存在一些缺点。详细内容请访问:《Implementing the Singleton Pattern in C#》。文章包含五种Singleton实现,就模式、线程、效率、延迟初始化等很多方面进行了详细论述。

转载于:https://www.cnblogs.com/tzh521241/archive/2012/07/18/SingletonPattern.html

【超详细】C#的单例模式 本文详细介绍了C#中的单例设计模式,包括两种实现方式:普通类泛型单例(Singleton<T>)和基于MonoBehaviour的组件单例(MonoSingleton<T>)。单例模式通过私有构造、静态私有实例和公共访问入口确保全局唯一实例,具有节省资源、保证数据一致性等优势。文章分别阐述了两者的核心原理、代码实现、使用场景及注意事项,并提供了日志管理器和音效管理器的具体应用示例。特别强调了多线程安全、初始化时机和避免过度使用等重要原则,为Unity开发中合理运用单例模式提供了全面指导。 阅读详情

相关推荐

设计模式|单例模式(Singleton Pattern)

单例模式(Singleton Pattern)是一种创建型设计模式,它确保类只有一个实例,并提供一个全局访问点来访问这个实例。

weixin_44435110的博客 1450

C#设计模式——单例模式(Singleton Pattern)

C#中设计模式——单例模式初步了解,单线程和多线程情况下使用。

qq_57198771的博客 5649

java设计模式之单例模式——Singleton pattern

设计模式故事会:https://blog.youkuaiyun.com/weixin_40205234/article/details/90664824 单例模式 单例模式(Singleton pattern)是java中最常见的设计模式之一。该模式属于创建型设计模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一...

ANGEL CITY 2519

C#中的单例模式

单例模式是一种确保一个类只有一个实例的设计模式。比如在各种工具类中,每次需要访问这个类的方法时,都实例化一个实例,这是明显不合适的通过上述实现单例模式的各种方法的探讨,我们还需要在实际开发过程中,根据不同的需求来进行选择不同的实现方式。比如一个比较小的项目,后续改动不大,可以通过第一种来实现;比如我们开发ASP.Net,这时我们就需要用到这种方式。

qq_29965505的博客 5270

c#单例模式(Singleton)的6种实现

1.1.1 摘要  在我们日常的工作中经常需要在应用程序中保持一个唯一的实例,如:IO处理,数据库操作等,由于这些对象都要占用重要的系统资源,所以我们必须限制这些实例的创建或始终使用一个公用的实例,这就是我们今天要介绍的——单例模式(Singleton)。  使用频率高 单件模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。 1.1.2 正文 图1单例模式(Singleton)结构图 单例模式(Singleton)是几个创建模式中最对立的一个,它的主要特点不是根据用户程序调用生成一个新的实例,而是控制某个类型的实例唯一性,通过上图我们知道它包含的角色只有一个,

ESP32-S3开发板烧录失败?Bootloader模式进入全攻略

本文详细解析了ESP32-S3开发板烧录失败的常见原因及解决方案,重点介绍了如何正确进入Bootloader模式。通过按键组合、硬件设计差异分析、自动下载模式失效排查等实用技巧,帮助开发者高效解决烧录问题,提升开发效率。

weixin_28716769的博客 591

设计模式 - Singleton pattern 单例模式

单例模式是一种创建型设计模式,它用来保证一个类只有一个实例, 并且提供一个访问该实例的全局节点。其在很多场景中都有应用,比如数据库连接池、日志记录器、Spring中对象的创建等。总的来说,单例模式在需要控制实例数量、确保全局唯一性的场景中被广泛应用。单例模式通过限制类的实例化对象为一个,可以确保全局唯一性的场景中被广泛应用,从而有助于控制资源访问、简化全局访问点、减少内存占用等,在很多情况下都可以提升程序的运行效率。

WLKQNYJY_SHT的博客 4112

AI算力网络与通信领域流量分析:优化策略探讨_副本

今天的AI就像一个"超级吃货",每天要"吃"掉海量数据、“消耗"巨量算力——训练一个千亿参数的大模型,可能需要上万块GPU同时工作数周,其间产生的数据传输量足以填满数百万个1TB硬盘。这些GPU和计算节点通过网络连接形成"AI算力网络”,而数据在节点间的流动就是"通信流量"。如果把算力比作AI的"肌肉",那流量就是"血液"——血液不通畅,肌肉再强也使不上劲。

AI天才研究院 1198

Design Pattern - Singleton Pattern (设计模式 - 单例模式)

什么是单例模式?我们只允许某个类存在唯一的一个实例 - 换句话说,对于某个类我们只new 一次为什么使用单例?比如线程池, Metrics Object, 或者Logging Object etc.  单例可以用来减少对资源的损耗,因为对于相同目的操作我们应该尽可能的重用而不是重建。如何使用单例?方法一package Chap5SingletonPattern; public class Sin...

YtdxYHZ的专栏 762

第55篇:数据隐私保护技术盘点——差分隐私、同态加密与它们的坑(踩坑总结)

数据隐私保护是AI工程化中必须严肃对待的课题。差分隐私和同态加密是两把利器,但也都是“重武器”,使用不当反而会伤及自身。差分隐私像“模糊处理”,通过加噪来保证统计安全性,要小心管理隐私预算和效用权衡。同态加密像“保险箱里打算盘”,保证了计算的精确性,但必须承受巨大的性能和工程复杂度代价。我的建议是:从小规模实验开始,先用DP-SGD在MNIST/CIFAR-10等标准数据集上感受噪声与精度的关系;再用TenSEAL等易用的库尝试一个加密逻辑回归,体会密文膨胀和速度延迟。

ai_blue_pm的博客 281

将指定文件夹下每张用LabelImg标注的图片中标注部分抠出来保存到指定文件夹下。

将指定文件夹下每张用LabelImg标注的图片中标注部分抠出来保存到指定文件夹下。

weixin_44119674的博客 440

设计模式——单例模式(Singleton Pattern)

详细介绍了单例模式的各种实现

mazouri的博客 1万+

OpenClaw人人养虾:接入Matrix

Matrix 是一个开放的去中心化通讯协议(Decentralized Communication Protocol),任何人都可以搭建自己的 Homeserver(家服务器)并与全球 Matrix 网络互联。OpenClaw 通过 Matrix Client-Server API 实现接入。

王国平的博客 526

【设计模式】——单例模式(Singleton Pattern)

单例模式(Singleton Pattern)是这些设计模式中的一种,它提供了一种创建对象的最佳方式,确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。这种模式在需要严格控制资源访问、管理全局状态或实现共享资源访问时非常有用。

J^T的博客 4738

GPU 资源池化云平台解决方案​

定义与特点Kubernetes是一个开源的容器编排和管理平台,通过提供自动化和声明式的方式来部署、扩展、维护和运行应用程序。它支持跨多个主机和集群部署容器,确保应用程序的高可用性和可扩展性。Kubernetes提供了丰富的功能和插件,允许用户根据自己的需求进行定制和扩展。架构与组件控制平面(Control Plane):负责集群的决策(如调度)和集群状态的检测与响应。

ZhangJiqun&191cm&85kg 1161

AutoSAR系列讲解(入门篇)2.2-SWC的类型

该章讲解了两种SWC的分类,并且映射到实际的工程中应该是具体的什么文件类型

雪云飞星的博客 4万+

设计模式-01单例模式Singleton Pattern

单例模式是一种创建型设计模式,确保类只有一个实例并提供全局访问点。常见实现方式包括:饿汉式(线程安全但提前创建)、懒汉式(延迟加载需同步)、双重检查锁定(高性能线程安全)、静态内部类(线程安全延迟加载)和枚举单例(最佳实践,防止反序列化攻击)。该模式广泛应用于框架如Spring的ApplicationContext和Netty的EventLoopGroup等场景,适用于需要全局唯一实例的情况。

d3y1`5 81_09 1465

【定位教程2----旋转中心标定之方法一】

【定位教程2----旋转中心标定之方法一】

Quintin 3万+

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

单例模式 定义 确保一个类只有一个实例,并为整个系统提供一个全局访问点 (向整个系统提供这个实例)。 类型 创建型。 适用场景 网站访问量计数器。 项目中用于读取配置文件的类。 Spring中,每个Bean默认都是单例的,这样便于Spring容器进行管理。 优点 由于单例模式只生成了一个实例,所以能够节约系统资源、减少性能开销、提高系统效率。 缺点 不适合用于变化频繁的对象;如果实例化的对象长...

kaven 5158

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

23种设计模式中的单例模式(Singleton Pattern)

本篇文章将23种设计模式中的单例设计模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

设计模式之单例模式(Singleton Pattern)

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。主要解决:一个全局使用的类频繁地创建与销毁。何时使用:当您想控制实例数目,节省系统资源的时候。如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。关键代码:构造函数是私有的。

weixin_42294716的博客 1398

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

设计模式——单例模式(Singleton Pattern)

设计模式——单例模式(Singleton Pattern) 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在有些场景中,为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,且该类能自行创建这个实例,这就是所谓的单例模式 文章目录设计模式——单例模式(Singleton Pattern)单例模式的优缺点优点缺点单例模式的应用场景单例模式与静态类的区别常见的7种实现方式1.饿汉模式2.懒

qq_42498542的博客 833

C# 设计模式——单例模式(Singleton Pattern)

单例模式(Singleton Pattern)是设计模式中最基础但应用最广泛的一种模式,它确保一个类只有一个实例,并提供一个全局访问点。在C#开发中,单例模式常用于管理共享资源、配置管理、日志系统等场景。

2404_88212162的博客 2890

设计模式之单例模式(Singleton Design Pattern)

单例设计模式(Singleton Design Pattern)理解起来非常简单。一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。

xjj1314的专栏 358

【设计模式】单例模式 Singleton Pattern

Java的对象,通常需要我们new出来,大多数时候,应对这种情况,我们很容易想到,只保持一个对象,并提供全局的访问,在并发的场景下,让它线程安全。

神也在Cpoy 1510
上一篇: .NET 的反射机制简单介绍
下一篇: 设计模式之简单工厂模式--Simple Factory Pattern
datuo2821
博客等级 码龄11年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值