.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日

相关文章

  • ASP.NET MVC4入门教程(三):添加一个视图

    让我来详细讲解一下“ASP.NET MVC4入门教程(三):添加一个视图”的完整攻略。 1. 为什么要添加视图 首先,需要理解什么是ASP.NET MVC4中的视图。视图是MVC模式中的“V”(即View)。一般来说,控制器从模型中获取数据并进行逻辑处理,然后将处理后的结果传递给视图,视图负责将数据渲染成HTML页面,最终呈现给用户。 由于视图是MVC模式中…

    C# 2023年5月31日
    00
  • C#枚举的高级应用

    接下来我将为你讲解C#枚举的高级应用。 1. 枚举的定义 在C#中,枚举本质上是一种值类型,它为一组相关的常量定义了一个公共类型别名。枚举使用关键字enum定义,通常被用来表示有限集合的值,如颜色(ILenum)、星期几、月份等。 下面是一段枚举的定义示例代码: enum Directions { North, South, East, West } 上述代…

    C# 2023年5月15日
    00
  • C# Stream.CopyTo – 复制流

    Stream.CopyTo 方法是C#中用于从当前流复制到目标流的一个方法。该方法可以被任何派生自Stream的对象调用。 该方法的具体作用是将数据从当前流中复制到指定的另一个流。通过该方法,可以将当前流中的数据直接复制到磁盘、网络套接字或其他流中。 具体使用方法如下: 语法 public void CopyTo(Stream destination); 该…

    C# 2023年4月19日
    00
  • linq中的分组操作符

    当需要对查询结果进行分组时,我们可以使用LINQ中的分组操作符。常用的分组操作符有GroupBy、ToLookup等。 GroupBy操作符 GroupBy操作符将一个序列按照指定条件分成多个组,并返回每个组及其对应的元素集合。其语法为: IEnumerable<IGrouping<TKey, TSource>> GroupBy&lt…

    C# 2023年6月1日
    00
  • C#使用HttpHelper框架重启路由器

    我们一步一步来。 概述 要使用HttpHelper框架重启路由器,我们需要先了解什么是HttpHelper框架和路由器重启的过程。 HttpHelper框架是一个基于.NET Framework的HTTP请求框架,可以帮助我们实现请求数据、提交数据、模拟浏览器,进而实现网络爬虫等多种功能。而路由器重启,则是通过模拟客户端向路由器发送重启指令,实现路由器远程重…

    C# 2023年6月3日
    00
  • Unity中的静态批处理和动态批处理操作

    在Unity中,静态批处理和动态批处理都是优化游戏性能的常用方法。静态批处理操作是在游戏启动时进行的优化,而动态批处理是在运行过程中动态进行的优化。 静态批处理操作 静态批处理操作主要是对游戏场景中的物体进行合并处理,将多个相同材质的物体合并成一个大的网格物体,以减少渲染次数和提高性能。 在使用静态批处理时,需要将相同材质的物体先进行设置,然后使用合并网格组…

    C# 2023年6月3日
    00
  • C# Mysql 查询 Rownum的解决方法

    下面就给你详细讲解C#和Mysql查询Rownum的解决方法。 什么是Rownum Rownum是Oracle数据库中的一个概念,用于获取指定条件下的前N条记录,但是在Mysql中并没有Rownum,可以通过一些技巧模拟出来。 解决方法 方法一:使用变量模拟Rownum 通过定义一个变量,然后根据变量的值来返回前N条结果。 SET @num := 0, @r…

    C# 2023年5月15日
    00
  • .NET基础面试题整理小结

    针对“.NET基础面试题整理小结”的攻略,我可以提供以下的完整过程和示例说明: 1. 确定文章的主旨和目标读者 首先需要明确,文章的主旨是整理.NET基础面试题,并对每个问题进行详细解答;目标读者是那些正在学习.NET编程或者准备参加.NET相关面试的人员。 2. 收集面试题库,按照分类整理 在整理.NET基础面试题时,需要先收集全面的面试题库,包括语言基础…

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