.Net设计模式之单例模式(Singleton)

.Net设计模式之单例模式(Singleton)

什么是单例模式?

在软件系统中,有些类只需要存在唯一的一个实例对象,比如系统中的窗口管理器、文件系统、计时器等,这些对象在系统中只允许存在一个实例。单例模式就是为了满足这类需求而生的一种设计模式。

单例模式是指在整个应用程序中只能有一个实例对象的类。通常情况下,单例模式是指全局社区共享的一个唯一对象实例,比如一个窗口管理器。

单例模式的应用场景

  • 一些类的对象只需要存在一个。 比如系统中唯一的日志记录器、数据库连接池等对象。
  • 计数器或计时器的应用。 比如系统中可以有多个计数器或计时器,但是它们的值需要被整个系统共享。
  • 创建对象时资源消耗过大,或者对象的生命周期过长。 比如系统中存在一个对象的创建需要大量的计算资源,或者该对象的生命周期很长,如果反复创建、销毁会导致系统资源浪费等问题。

实现单例模式的方法

饿汉式

饿汉式在类被加载的时候就创建了实例对象,并且对象在整个应用程序中都可以被访问。这种方法非常直观简单,但是存在性能问题,因为如果应用程序中没有用到该对象,那创建对象的操作就变成了一次无效的操作,浪费了系统资源。

public class Singleton {
    // 在类加载的时候就创建了对象
    private static Singleton instance = new Singleton();

    // 私有构造函数,避免外部对类进行实例化
    private Singleton() {}

    // 返回单例对象实例
    public static Singleton GetInstance() {
        return instance;
    }
}

懒汉式

懒汉式是指在第一次使用对象时才创建该对象的实例,并且只创建一个。这种方法可以避免浪费系统资源的问题,但是可能出现多线程访问时多次创建实例对象的问题,需要采取措施来保证线程安全。

public class Singleton {
    // 私有静态变量,保存单例对象实例
    private static Singleton instance = null;

    // 私有构造函数,避免外部对类进行实例化
    private Singleton() {}

    // 返回单例对象实例
    public static Singleton GetInstance() {
        if(instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

双重检查锁定

此处所谓双重检查锁定就是指在多线程访问时,通过加锁的方式解决多次创建实例对象的问题。通过使用这种方法可以避免性能问题,并且保证线程安全。

public class Singleton {
    // 私有静态变量,保存单例对象实例
    private static Singleton instance = null;

    // 定义一个线程锁
    private static readonly object lockObject = new object();

    // 私有构造函数,避免外部对类进行实例化
    private Singleton() {}

    // 返回单例对象实例
    public static Singleton GetInstance() {
        // 第一重检查,判断对象是否已经存在了
        if(instance == null) {
            // 加锁,避免多个线程同时调用CreateInstance方法创建实例对象
            lock(lockObject) {
                // 第二重检查,判断对象是否已经存在了
                if(instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

示例说明

示例1:创建单例的计数器

在此示例中,我们创建了一个计数器类,它可以实现对应用程序中所有计数器对象进行计数,同时确保整个应用程序中只有一个计数器对象实例。

public class Counter {
    private static readonly object lockObject = new object();
    private static Counter instance = null;

    public int Count { get; private set; }

    private Counter() {}

    public static Counter GetInstance() {
        if(instance == null) {
            lock(lockObject) {
                if(instance == null) {
                    instance = new Counter();
                }
            }
        }
        return instance;
    }

    public void Add() {
        Count++;
    }

    public void Reset() {
        Count = 0;
    }
}

示例2:创建单例的配置管理器

在此示例中,我们创建了一个配置管理器类,它可以实现对应用程序中所有配置信息进行管理,同时确保整个应用程序中只有一个配置管理器对象实例。

public class ConfigManager {
    private static readonly object lockObject = new object();
    private static ConfigManager instance = null;

    private Dictionary<string, string> configDict = new Dictionary<string, string>();

    private ConfigManager() {}

    public static ConfigManager GetInstance() {
        if(instance == null) {
            lock(lockObject) {
                if(instance == null) {
                    instance = new ConfigManager();
                }
            }
        }
        return instance;
    }

    public void AddConfig(string key, string value) {
        if(!configDict.ContainsKey(key)) {
            configDict.Add(key, value);
        }
    }

    public string GetConfig(string key) {
        if(configDict.ContainsKey(key)) {
            return configDict[key];
        }
        return null;
    }

    public void RemoveConfig(string key) {
        if(configDict.ContainsKey(key)) {
            configDict.Remove(key);
        }
    }
}

以上就是单例模式的设计和实现方法及示例说明。需要注意的是,单例模式不适用于存在多个实例对象的场景,否则会导致应用程序出现严重的设计问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.Net设计模式之单例模式(Singleton) - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C#实现单件模式的三种常用方法

    C#实现单件模式的三种常用方法 在设计模式中,单件模式(Singleton Pattern)是一种常用的创建型设计模式,它能够确保一个类只有一个实例,并提供全局的访问点。在C#中,实现单件模式的方法比较多,本文将介绍其中的三种常用方法。 方法一:饿汉式(静态初始化) 饿汉式是最简单、常用的实现单件模式的方式之一。它在类加载时就创建了实例,因此线程安全,但是会…

    C# 2023年6月7日
    00
  • 一文掌握C# JSON(2023最新整理)

    一文掌握C# JSON(2023最新整理) 什么是JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript的一个子集,可以被多种编程语言读取和写入。JSON格式最初由 Douglas Crockford 提出,现已成为一种公认的数据交换格式。 C#中使用JSON的方式 C#中有多种库可…

    C# 2023年5月31日
    00
  • c#基于WinForm的Socket实现简单的聊天室 IM

    下面是基于WinForm的Socket实现简单聊天室IM的完整攻略: 1. 项目开发前准备 1.1 工具准备 首先确保你已经安装了以下工具: .NET Framework(版本3.5及以上): .NET Framework是Windows应用程序开发所必需的。 1.2 环境准备 在开始聊天室开发之前,请确认以下环境已经正确配置: 计算机命名或IP地址 端口号…

    C# 2023年5月15日
    00
  • C#实现Stream与byte[]之间的转换实例教程

    开始之前,我们需要了解两个概念:Stream 和 byte[]。 Stream 代表一个抽象的、可以被任意类型的数据读取和写入的流。它是一种序列化数据的方式,把不同的数据类型都转化成字节流。 在 C# 中,常用的 Stream 类有 FileStream、MemoryStream、NetworkStream 等。 而 byte[](字节数组)则是一组按照连续…

    C# 2023年6月7日
    00
  • C# 数独求解算法的实现

    C# 数独求解算法的实现 本文将详细讲解如何使用C#语言实现数独求解算法。 数独简介 数独是一种逻辑类的游戏,玩家需要在9*9宫的大九宫格中,填入数字1~9,使每行、每列、每个小九宫格内都恰好包含数字1~9,且不重复。 算法思路 数独求解算法的基本思路是采用回溯算法。从数独的左上角开始,依次尝试填入1~9的数字,若当前填入的数字满足数独条件,则进入下一格继续…

    C# 2023年6月6日
    00
  • C# CM框架实现多页面管理的实例代码

    下面就是“C# CM框架实现多页面管理的实例代码”的详细攻略: 什么是C# CM框架 C# CM框架是一种用于管理C#应用程序中多个页面的框架。它提供了一种方式,让您能够更轻松地创建、管理和切换应用程序中的多个页面。C# CM框架是基于MVVM(模型视图视图模型)设计模式开发的。 实例代码 下面是一个简单的示例,将演示如何使用C# CM框架在WPF应用程序中…

    C# 2023年6月3日
    00
  • C#逐行读取txt文件的方法

    当我们需要读取文本文件内容时,可以使用C#内置的System.IO命名空间中的StreamReader类。 以下是逐行读取txt文件并输出内容的代码示例: using System.IO; // 读取文件路径 string filePath = "example.txt"; // 判断文件是否存在 if (File.Exists(file…

    C# 2023年6月1日
    00
  • ASP.NET Core MVC中Tag Helpers用法介绍

    ASP.NET Core MVC 中 Tag Helpers 用法介绍攻略 Tag Helpers 是 ASP.NET Core MVC 中的一个重要特性,它们可以帮助我们更轻松地创建 HTML 标记,并将 C# 代码与 HTML 标记混合在一起。在本攻略中,我们将介绍 ASP.NET Core MVC 中 Tag Helpers 的用法,包括如何创建自定义…

    C# 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部