首页 > 其他分享 >设计模式- 单例模式

设计模式- 单例模式

时间:2023-09-04 15:12:30浏览次数:26  
标签:Singleton private instance static 模式 单例 设计模式 public

单例模式是一种创建型设计模式, 可以保证一个类型有且只有一个实例存在

单例模式的适用于什么场景

当一个类在程序运行期间只需要一个实例的时候, 就可以考虑将其做成单例模式

例如一些全局的配置, 用来储存程序运行期间全局的共享配置, 或者可以做一个简单的消息管道, 程序中所有地方只需要这一个消息管道来发送和接收消息

单例模式的实现

单例模式有多种实现方式, 但是都离不开非公有的构造函数和静态成员变量

下面根据我自己的经验, 介绍三种比较常见的实现

饿汉式

饿汉式在类型加载的时候就直接进行实例化

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton(){}
    public static Singleton GetInstance() => instance;
}

饿汉式最简单方便, 总有人说饿汉式会浪费内存, 但是在大多数情况下这点内存浪费可以忽略不计, 相比起其他业务中的浪费, 九牛一毛都算不上

懒汉式

懒汉式在第一次调用GetInstance的时候才进行实例化

public class Singleton {
    private static Singleton instance;
    private Singleton(){}
    public static Singleton GetInstance() => instance ??= new Singleton();
}

懒汉式这种在调用GetInstance的时候才实例化的方式避免了大概率微不足道的内存浪费, 但又会出现线程安全问题

双重校验锁

双重校验锁通过加锁可以解决懒汉式多线程下的线程不安全问题

public class Singleton
{
    private static volatile Singleton instance;
    private static object lockobj = new Object();
    private Singleton() { }
    public static Singleton GetInstance()
    {
        if (instance == null)
        {
            lock (lockobj)
            {
                instance ??= new Singleton();
            }
        }
        return instance;
    }
}

但是用饿汉式就不需要这么麻烦

如何去使用

设计一个单例类用于记录服务器的在线人数

public sealed class LoginCounter
{
    private static readonly LoginCounter instance = new LoginCounter();
    private LoginCounter() { }
    public static LoginCounter GetInstance() => instance;

    private List<User> OnlineUsers = new List<User>();
    public int LoginCount { get => OnlineUsers.Count; }
    public void Login(User user)
    {
        if (OnlineUsers.Any(item => item.Name == user.Name))
            return;
        OnlineUsers.Add(user);
    }
    public void Logout(User user)
    {
        if (!OnlineUsers.Any(item => item.Name == user.Name))
            return;
        OnlineUsers.RemoveAll(item => item.Name == user.Name);
    }
}
public class User
{
    public string Name { get; set; }
}

有人登录进来就使用

LoginCounter.GetInstance().Login(user);

有人退出登录就使用

LoginCounter.GetInstance().Logout(user);

标签:Singleton,private,instance,static,模式,单例,设计模式,public
From: https://www.cnblogs.com/CollapseNav/p/17677101.html

相关文章

  • C#中单例模板
    泛型单例/***泛型单例模板where限制这个单例类必须要能被new出来*/publicclassSingleton<T>:IDisposablewhereT:new(){privatestaticTinstance;publicstaticTInstance{get{if(instance==null)instance=new......
  • 关于VIM以插入模式粘贴
    Pasteininsertmode?是否可以在Vim中以插入模式粘贴?在插入模式下,按CTRL-R{register}例子:CTRL-R*将插入剪贴板的内容CTRL-R"(未命名的寄存器)插入最后的删除或取消。要在vim的帮助中找到此内容,请键入:hi_ctrl-r相关讨论是的,我直到最近才了解CTRL-R及其非常有......
  • 1数据库模式
    数据库分三级模式外模式:用户试图应用程序(外模式与概念模式映射),数据库展示内容,用户视图概念模式:基本表,逻辑模式,核心,外模式数据是从概念模式来的内模式:物理存储文件(基本表存在内模式:概念模式与内模式映射) 关系有3中类型基本关系查询表试图表:从基本表和其他视图导出来的表,虚......
  • 界面控件DevExpress .NET应用安全 & Web API v23.1亮点:支持Swagger模式
    DevExpress拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpressDashboardeXpressApp框架、适用于VisualStudio的CodeRush等一系列辅助工具。DevExpress今年第一个重要版本v23.1日前已正式发布了,该版本拥有众多新产品和数十个具有高影响力的功能,可为桌......
  • 设计模式备忘录+命令模式实现Word撤销恢复操作
    文章目录前言思路代码实现uml类图总结前言最近学习设计模式行为型的模式,学到了备忘录模式提到这个模式可以记录一个对象的状态属性值,用于下次复用,于是便想到了我们在Windows系统上使用的撤销操作,于是便想着使用这个模式进行一次模仿复现思路以下是按照备忘录和命令模式结合的思路......
  • 设计模式行为模式-访问者模式
    文章目录介绍基本原理1.定义访问者模式2.角色及其职责2.1元素(Element)2.2具体元素(ConcreteElement)2.3访问者(Visitor)2.4具体访问者(ConcreteVisitor)2.5对象结构(ObjectStructure)3.访问者模式的工作流程适用场景1.对象结构稳定,但需要经常增加新的操作2.处理复杂的对象结构,并......
  • 外观模式:简化复杂子系统的访问与使用
    文章目录1.简介2.外观模式的基本结构3.外观模式的实现步骤4.外观模式的应用与实例4.1图形界面库的外观模式应用4.2文件压缩与解压缩的外观模式应用4.3订单处理系统的外观模式应用5.外观模式的优缺点5.1优点5.2缺点6.总结1.简介外观模式是一种结构型设计模式,它提供了......
  • 设计模式-原型模式详解
    文章目录前言理论基础1.原型模式定义2.原型模式角色3.原型模式工作过程4.原型模式的优缺点实战应用1.原型模式适用场景2.原型模式实现步骤3.原型模式与单例模式的区别原型模式的变体1.带有原型管理器的原型模式2.懒汉式单例模式的原型模式实现3.细粒度原型模式总结前言......
  • 设计模式-装饰模式
    文章目录一、简介二、基本概念三、装饰模式的结构和实现类图解析:装饰器的实现方式继承实现:组合实现:继承和组合对比四、装饰模式的应用场景五、与其他模式的关系六、总结一、简介装饰模式是一种结构型设计模式,它允许动态地向对象添加额外的功能。二、基本概念装饰模式定义:在不改变......
  • 设计模式-迭代器
    文章目录1.引言1.1概述1.2设计模式1.3迭代器模式的应用场景1.4迭代器模式的作用2.基本概念2.1迭代器Iterator2.2聚合Aggregate2.3具体聚合ConcreteAggregate3.Java实现迭代器模式3.1Java集合框架3.2Java迭代器接口3.3Java迭代器模式实现示例4.迭代器模式的优......