.NET高级面试指南专题十三【 单例模式介绍,用单例模式写个缓存器】

在这里插入图片描述

单例模式是一种常用的设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这在某些情况下很有用,特别是当系统中只应该存在一个实例时,如数据库连接、日志记录器、线程池等。

在C#中,实现单例模式有多种方式,下面介绍其中的两种常用方式:

饿汉式单例模式:
这种方式在类加载时就创建了实例,因此称为“饿汉式”。它的优点是实现简单,线程安全,但缺点是可能造成资源浪费,因为不管是否使用都会创建实例。

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

懒汉式单例模式:
这种方式在需要时才创建实例,称为“懒汉式”。它的优点是节省资源,但需要考虑线程安全性,可以使用锁或者双重检查锁定等方式来保证线程安全。

public sealed class Singleton
{private static readonly object padlock = new object();private static Singleton instance = null;private Singleton() { }public static Singleton Instance{get{lock (padlock){if (instance == null){instance = new Singleton();}return instance;}}}
}

常见的场景下使用单例模式包括:

  • 数据库连接:确保在整个应用程序中只有一个数据库连接实例。
  • 日志记录器:确保在整个应用程序中只有一个日志记录器实例。
  • 配置管理器:确保在整个应用程序中只有一个配置管理器实例。
  • 缓存:确保在整个应用程序中只有一个缓存实例。

单例模式在需要确保只有一个实例存在并且提供全局访问点的情况下是非常有用的。

下面写一个一个基于懒汉式单例模式的缓存管理器示例:

using System;
using System.Collections.Generic;public sealed class CacheManager
{// 使用静态变量存储唯一实例private static volatile CacheManager instance;// 使用双重锁定确保线程安全private static readonly object syncRoot = new object();// 使用字典存储缓存数据private Dictionary<string, object> cacheData;// 私有构造函数,防止外部实例化private CacheManager(){cacheData = new Dictionary<string, object>();}// 全局访问点public static CacheManager Instance{get{if (instance == null){lock (syncRoot){if (instance == null){instance = new CacheManager();}}}return instance;}}// 添加数据到缓存public void Add(string key, object value){cacheData[key] = value;}// 从缓存中获取数据public object Get(string key){if (cacheData.ContainsKey(key)){return cacheData[key];}else{Console.WriteLine($"Key '{key}' not found in cache.");return null;}}
}class Program
{static void Main(string[] args){// 使用单例模式获取缓存管理器实例CacheManager cacheManager = CacheManager.Instance;// 向缓存中添加数据cacheManager.Add("key1", "value1");cacheManager.Add("key2", "value2");// 从缓存中获取数据Console.WriteLine(cacheManager.Get("key1")); // 输出:value1Console.WriteLine(cacheManager.Get("key2")); // 输出:value2Console.WriteLine(cacheManager.Get("key3")); // 输出:Key 'key3' not found in cache.// 尝试通过构造函数实例化新的对象,将无法实现// CacheManager anotherInstance = new CacheManager(); // 报错:CacheManager.CacheManager() is inaccessible due to its protection level}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/506076.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三百七十七回

文章目录 1. 概念介绍2. 实现方法2.1 maskFilter2.2 shader 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"两种阴影效果"相关的内容&#xff0c;本章回中将介绍如何绘制阴影效果.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概…

索引使用规则6——单列索引联合索引

1、单列索引 单列索引&#xff1a;即一个索引只包含单个列 举个例子 1.1、给phone和那么建立索引 create index index_name on tb_qianzhui(name); create index index_phone on tb_qianzhui(phone);1.2、查询发现可能的索引有好几个&#xff0c;但是最终选择了phone的索引…

wy的leetcode刷题记录_Day80

wy的leetcode刷题记录_Day80 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间&#xff1a;2024-3-2 前言 目录 wy的leetcode刷题记录_Day80声明前言2368. 受限条件下可到达节点的数目题目介绍思路代码收获 92. 反转链表 II题目介绍思路代码收获 2368…

代码随想录day11(1)字符串:反转字符串中的单词 (leetcode151)

题目要求&#xff1a;给定一个字符串&#xff0c;将其中单词顺序反转&#xff0c;且每个单词之间有且仅有一个空格。 思路&#xff1a;因为本题没有限制空间复杂度&#xff0c;所以首先想到的是用split直接分割单词&#xff0c;然后将单词倒叙相加。 但如果想让空间复杂度为O…

内存的检测与排查

内存&#x1f40e;的检测与排查 文章目录 内存&#x1f40e;的检测与排查查杀Java Web filter型内存马0x01 内存马简历史0x02 查杀思路0x03 内存马的识别0x04 内存马的查杀 查杀Java Web filter型内存马 0x01 内存马简历史 其实内存马由来已久&#xff0c;早在17年n1nty师傅的…

一文解决Onlyfans年龄验证问题(小白必看)

前言&#xff1a;很多用户在 OnlyFans 添加信用卡时&#xff0c;出现了年龄验证问题导致操作失败。出现这个问题的原因一是用国内邮箱注册了&#xff0c;二是绑卡时的 IP 有问题&#xff0c;会导致年龄验证、无法支付 OnlyFans 等问题。下面是一些逐步验证的步骤&#xff0c;供…

2、事件机制、DOM操作、jquery对尺寸操作、jquery添加和删除

一、事件机制 1、事件源.事件类型(事件处理程序) $(this)中的this不能加引号 $(#box).click(function () {$(this).css(background-color,blue)//点击颜色变为蓝色 })2、事件源.on/bind(事件类型&#xff0c;事件处理程序) $("#box").on(dbclick,function () {$(…

什么是Vue指令?请列举一些常见的Vue指令以及它们的用法

Vue.js 是一款流行的前端框架&#xff0c;它的指令&#xff08;Directives&#xff09;是 Vue.js 提供的一种特殊属性&#xff0c;用于在模板中对 DOM 元素进行直接操作。指令通常是以 v- 开头的特殊属性&#xff0c;用于响应式地将数据绑定到 DOM 元素上。 在 Vue 中&#xf…

#WEB前端

1.实验&#xff1a;vscode安装&#xff0c;及HTML常用文本标签 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; &#xff08;1&#xff09;网页直接搜索安装vscode &#xff08;2&#xff09;打开vscode&#xff0c;在下图分别安装以下插件&#xff1a; Html Css Support …

机器学习:模型选择和模型优化

进行数据处理之后&#xff0c;我们得到了x_train和y_train&#xff0c;我们就可以用来进行回归或分类模型训练啦~ 一、模型选择 我们这里可能使用的是回归模型&#xff08;Regression&#xff09;&#xff0c;值得注意的是&#xff0c;回归和分类不分家。分类是预测离散值&…

【leetcode】用队列实现栈

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 点击查看题目 思路: 在做此题之前&#xff0c;我们先要实现队列&#xff0c;这在上个博客中已经写过&#…

浅析 explicit 关键字

浅析 explicit 关键字 文章目录 浅析 explicit 关键字前言案例剖析补充案例总结 前言 ​ C 提供了多种方式来实现类型转换和构造对象&#xff0c;然而&#xff0c;有时候这些方式会导致一些意想不到的结果&#xff0c;比如隐式转换和复制初始化。为了避免这些潜在的问题&#…