单例模式好处

本文深入介绍了单例模式的概念及其在C#中的应用。探讨了如何通过单例模式保证一个类只有一个实例,并提供全局访问点。此外,还分析了单例模式的优点、缺点以及适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

C#

保证一个类仅有一个实例,并提供一个访问它的全局访问点
实现要点
Singleton模式是限制而不是改进类的创建。
Singleton类中的实例构造器可以设置为Protected以允许子类派生。
Singleton模式一般不要支持Icloneable接口,因为这可能导致多个对象实例,与Singleton模式的初衷违背。
Singleton模式一般不要支持序列化,这也有可能导致多个对象实例,这也与Singleton模式的初衷违背。
Singleton只考虑了对象创建的管理,没有考虑到销毁的管理,就支持垃圾回收的平台和对象的开销来讲,我们一般没必要对其销毁进行特殊的管理。
理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的构造器的任意调用”。
可以很简单的修改一个Singleton,使它有少数几个实例,这样做是允许的而且是有意义的。
优点
实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例
灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程
缺点
开销:虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题,上面的五种实现方式中已经说过了。
可能的开发混淆:使用 singleton 对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用 new 关键字实例化对象。因为可能无法访问库 源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
对象的生存期:Singleton 不能解决删除单个对象的问题。在提供 内存管理的语言中(例如基于 .NET Framework 的语言),只有 Singleton 类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除
对象实例,但这样会导致 Singleton 类中出现悬浮引用。
适用性
当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
 
代码示例:
双重锁机制
namespace Singleton
{
  public class Singleton
  {
  //定义一个私有的静态全局变量来保存该类的唯一实例
private static Singleton singleton;
//定义一个只读静态对象  
//且这个对象是在程序运行时创建的   
private static readonly object syncObject = new object();
/// <summary>
/// 构造函数必须是私有的
/// 这样在外部便无法使用 new 来创建该类的实例
/// </summary>
private Singleton()
  {}
/// <summary>
  /// 定义一个全局访问点
  /// 设置为静态方法
  /// 则在类的外部便无需实例化就可以调用该方法
  /// </summary>
  /// <returns></returns>
  public static Singleton GetInstance()
  {
//这里可以保证只实例化一次   
//即在第一次调用时实例化   
//以后调用便不会再实例化
//第一重 singleton == null   
if (singleton == null)
{
  lock (syncObject)
  {
  //第二重 singleton == null
  if (singleton == null)
  {
singleton = new Singleton();
  }
  }
  }
  return singleton;
  }
  }
  }
 
 
 
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/hsha/p/4579391.html

### 使用单例模式封装 Axios 的好处 当使用单例模式来封装 Axios 进行 API 请求时,可以带来多个显著的优势: #### 1. 统一配置管理 通过创建一个 Axios 实并将其作为对象提供给整个应用程序,可以在一处集中管理和修改请求的基础 URL、超时时间以及其他默认设置。这不仅减少了重复代码的数量,还提高了维护性和可读性。 ```javascript // 创建一个全局可用的 Axios const axiosInstance = axios.create({ baseURL: 'https://api.example.com', timeout: 5000, }); ``` #### 2. 中间件机制支持 利用 Axios 提供的拦截器功能,在发送请求前或接收响应后执行特定逻辑变得非常容易实现。比如添加身份验证头信息、处理错误情况或是日志记录等功能都可以在此处完成而无需每次调用接口都手动编写相同业务逻辑[^1]。 ```javascript axiosInstance.interceptors.request.use( config => { const token = localStorage.getItem('authToken'); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }, error => Promise.reject(error) ); ``` #### 3. 更好的依赖注入与测试友好型设计 由于只存在唯一的一个 Axios 客户端实被广泛应用于项目内部各个模块之间通信交互过程中;因此可以通过模拟该客户端行为来进行元测试工作而不必担心其他地方会受到影响。同时这也使得不同部分之间的耦合度降低了许多。 ```typescript class ApiService { private static instance: ApiService; private constructor(private readonly client: typeof axios) {} public static getInstance(): ApiService { if (!ApiService.instance) { ApiService.instance = new ApiService(axiosInstance); } return ApiService.instance; } // ... other methods ... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值