.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#操作文件路径(Directory)的常用静态方法详解

    关于C#操作文件路径(Directory)的常用静态方法详解 Directory类的简介 在C#中,Directory类提供了用于操作文件夹和文件路径的静态方法。它通过一系列的静态方法,可以实现对于文件夹以及文件路径的各种操作。常用的静态方法有以下几种: Directory.Exists(string path):判断某个路径是否存在 Directory.C…

    C# 2023年5月15日
    00
  • ASP.net 验证码实现代码(C#)

    ASP.NET 验证码实现代码(C#)攻略 前言 验证码是一种常用的安全验证手段,用于防止恶意机器人注册、登录、提交表单等操作。本篇文章将介绍如何在ASP.NET中使用C#实现验证码功能。 实现过程 1. 生成随机字符串 首先,我们需要生成一串随机字符串,作为验证码。可以使用Random类和StringBuilder类来生成: Random random =…

    C# 2023年5月31日
    00
  • C#中析构函数、Dispose、Close方法的区别

    本文将详细讲解”C#中析构函数、Dispose、Close方法的区别”,让您对它们有更清晰的认识。 析构函数 首先,我想说的是析构函数。析构函数在对象销毁之前调用,用于释放该对象占用的资源。在C#中,析构函数是通过在类名前加上”~”符号来定义的。例如: public class MyClass { ~MyClass() { // 释放资源的代码 } } 在.…

    C# 2023年6月8日
    00
  • WinForm实现按名称递归查找控件的方法

    下面开始讲解WinForm实现按名称递归查找控件的方法的攻略。 什么是WinForm? WinForm是Windows Forms的缩写,是一个在Windows操作系统上创建桌面应用程序的API。WinForm允许开发人员在Windows的桌面环境中创建GUI应用程序,通过WinForm框架,开发人员可以方便地创建一个能够响应用户操作的UI。 控件查找的应用…

    C# 2023年6月6日
    00
  • C#基于纯数学方法递归实现货币数字转换中文功能详解

    C#基于纯数学方法递归实现货币数字转换中文功能 简介 本文将介绍如何基于纯数学方法及递归算法来实现C#中将货币数值转换为中文汉字的功能。 前置知识 在开始之前,您需要掌握以下C#基础知识: 程序流程控制语句 递归算法 同时您需要了解以下汉字中的数字: 个位数:零、一、二、三、四、五、六、七、八、九 十位数:十、二十、三十、四十、五十、六十、七十、八十、九十 …

    C# 2023年6月7日
    00
  • 使用ajax局部刷新gridview进行数据绑定示例

    下面是使用ajax局部刷新gridview进行数据绑定的完整攻略,包含两条示例说明。 什么是ajax局部刷新 ajax(Asynchronous JavaScript and XML)是一种无需重新加载整个页面而能够更新其中某个局部内容的Web开发技术。当数据发生变化时,ajax技术可以局部刷新响应部分,而不用重新加载整个页面,从而提高用户体验。 如何使用a…

    C# 2023年6月8日
    00
  • 如何在C#中调用COM组件

    在C#中调用COM组件需要经过以下步骤: 步骤1:添加COM组件到项目引用中 在Visual Studio中,右键项目名称,选择“添加引用”,然后在弹出的窗口中选择“COM”选项卡,浏览并选择需要添加的COM组件。确定后,Visual Studio将自动添加COM组件的引用。 步骤2:创建COM组件的实例对象 在C#代码中,使用Type类和Activator…

    C# 2023年5月15日
    00
  • C#基于SQLiteHelper类似SqlHelper类实现存取Sqlite数据库的方法

    一、背景介绍SQLite是一个轻量级的关系型数据库,具有体积小,速度快,操作简便,易于集成等优点,在嵌入式设备,移动设备及桌面应用程序等方面得到广泛使用。C#语言作为一个跨平台的编程语言,在各个领域的应用也十分广泛,同时也提供了SQLite数据库的连接方式,提供SQLite连接C#的API。虽然C#提供了一些SQLite的API,但是操作SQLite数据库仍…

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