首页 > 编程语言 >Singleton 单例模式简介与 C# 示例【创建型】【设计模式来了】

Singleton 单例模式简介与 C# 示例【创建型】【设计模式来了】

时间:2023-05-25 18:56:05浏览次数:50  
标签:Singleton null 示例 instance static 单例 设计模式 public

 〇、简介

1、什么是单例模式?

一句话解释:

  单一的类,只能自己来创建唯一的一个对象。

单例模式(Singleton Pattern)是日常开发中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有一个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象

 一个比喻:(班主任与学生)

  比如一个班级,只有一个班主任,任何一个同学要找班主任,都是找的同一个,班主任忙的时候,当然就出现排队的情况。

2、优缺点和使用场景

  • 优点:内存里只有一个实例,减少了内存的开销,也避免了对象高频创建带来的性能损耗。
  • 缺点:任务量大时,会出现排队,耗时增加。另外与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

 使用场景举例:

  • 要求生产唯一序列号。
  • WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
  • 创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

一、单例模式简单实现

public class Singleton
{
    private static Singleton instance = null;
    private static object lockObject = new object();
    /// <summary>
    /// 私有化构造函数,防止外部实例化
    /// </summary>
    private Singleton() { }
    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (lockObject) // 线程同步锁
                {
                    if (instance == null) // Lazy Initialization
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
    /// <summary>
    /// 重置 Singleton
    /// </summary>
    public void Reset()
    {
        instance = null;
    }
}

 测试代码:

static void Main(string[] args)
{
    var instance1 = Singleton.Instance;
    var instance2 = Singleton.Instance;
    Console.WriteLine(instance1 == instance2); // 输出 true 
}

二、带参数的单例模式实现

public class SingletonParameters
{
    private static SingletonParameters instance = null;
    private static object lockObject = new object();
    private int _firstvalue, _secondvalue;
    /// <summary>
    /// 私有化构造函数,防止外部实例化
    /// </summary>
    private SingletonParameters(int first, int second)
    {
        this._firstvalue = first;
        this._secondvalue = second;
    }
    public static SingletonParameters InstanceParameters(int first, int second)
    {
        if (instance == null)
        {
            lock (lockObject) // 线程同步锁
            {
                if (instance == null) // Lazy Initialization
                {
                    instance = new SingletonParameters(first, second);
                }
            }
        }
        else
        {
            instance.FirstValue = first;
            instance.SecondValue = second;
        }
        return instance;
    }
    public int FirstValue { get { return _firstvalue; } set { _firstvalue = value; } }
    public int SecondValue { get { return _secondvalue; } set { _secondvalue = value; } }
    /// <summary>
    /// 重置 Singleton
    /// </summary>
    public void Reset()
    {
        instance = null;
    }
}

 测试代码:

var instance1 = SingletonParameters.InstanceParameters(1, 2);
Console.WriteLine($"FirstValue:{instance1.FirstValue}");
Console.WriteLine($"SecondValue:{instance1.SecondValue}");
var instance2 = SingletonParameters.InstanceParameters(3, 4);
Console.WriteLine($"FirstValue:{instance2.FirstValue}");
Console.WriteLine($"SecondValue:{instance2.SecondValue}");
Console.WriteLine($"instance1 == instance2 : {instance1 == instance2}");

 

参考:https://www.cnblogs.com/gaochundong/p/design_pattern_singleton.html

标签:Singleton,null,示例,instance,static,单例,设计模式,public
From: https://www.cnblogs.com/czzj/p/SJMSLL_Singleton.html

相关文章

  • 普加项目管理中间件示例之一:标准列
    官方提供了一下这些标准的列:列名任务属性描述PlusProject.IDColumnID任务序号。PlusProject.WBSColumnWBSWBS编码。PlusProject.NameColumnName任务名称。PlusProject.DurationColumnDuration工期。PlusProject.StartColumnStart开始日期。PlusProject.FinishColumnFinish完成日期......
  • 普加项目管理中间件示例之二:自定义表格列
    自定义表格列示例demo/diyColumns.html上文介绍了标准列,这里介绍一下自定义列。正如标准列是一些预设好的对象,自定义列也是一个对象。支持多种数据类型的列:String、Number、Boolean、Date、Array等支持多种单元格编辑器:TextBox、Spinner、CheckBox、DatePicker、ComboBox、TreeSel......
  • 设计模式整理
    责任链模式顾名思义,责任链模式(ChainofResponsibilityPattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该......
  • 设计模式(三)行为型
    1、策略模式和桥梁模式很相似,但桥梁模式的耦合更低,结构更复杂一些。 2、观察者模式观察者模式是一种行为型设计模式,当一个对象发生改变时,所有依赖它的对象都会得到通知并自动更新。这种模式也被称为发布-订阅模式或者消息机制。观察者模式包含以下几个角色:Subject(主题):被......
  • 设计模式(二)结构型
    1、代理模式创建一个代理对象来控制对另一个对象的访问,以提供额外的功能或限制。1publicinterfaceFoodService{2FoodmakeChicken();3FoodmakeNoodle();4}56publicclassFoodServiceImplimplementsFoodService{7publicFoodmakeChic......
  • 入门爬虫示例-爬取豆瓣短评
    群里有个小妹妹,让我帮她写的代码,好像是作业什么的。花了几分钟看了一下,随便写写,分享给有需要的童鞋,我用python3写的,实现的功能就是:爬取豆瓣短评,然后将数据写入本地的excel表格,数据大概有,电影名称,评分,评论人数,短评四项,稍微修改下也可以爬取其他数据。这属于入门学习的爬虫,博客里的......
  • Java设计模式-建造者模式
    简介建造者模式是一种创建型设计模式,用于将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式通过将复杂对象的构建过程分解为多个简单的步骤来实现。与其他创建型模式不同,建造者模式强调的是将构建过程与表示分离,而不是将对象与其构建方式分离......
  • 《设计模式之禅》Singleton_Pattern--单例模式
    单例模式这个模式是很有意思,确实很有意思的,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一、独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个比较难复制的对象:皇帝(就是那个天子)中国的历史上很少出现两个皇帝并存的......
  • 设计模式(一)创建型
    1、单例模式饿汉模式(最简单):类加载的时候就创建对象,线程安全publicclassSingleton{//首先,将构造方法私有化privateSingleton(){};//创建私有静态实例,意味着在类加载就会进行创建privatestaticSingletoninstance=newSingleton();public......
  • 20、Web服务示例
    如下是main.rs文件内容://src\main.rsusehello::ThreadPool;usestd::thread;usestd::time::Duration;usestd::fs;usestd::io::prelude::*;usestd::net::TcpStream;usestd::net::TcpListener;fnmain(){letlistener=TcpListener::bind("127.0.0.1:78......