〇、简介

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 单例模式简介与 C# 示例【创建型】【设计模式来了】的更多相关文章

  1. OOAD-设计模式(三)之创建型设计模式(5种)

    前言 前面介绍了OOAD的基础知识,现在我们来详细的说明一下GOF设计模式中的23种模式,希望大家能够学到东西! 一.工厂方法模式(Factory Method) 1.1.工厂方法模式概述 工厂方法模 ...

  2. javaScript设计模式-创建型设计模式

    我们大家一听到设计模式就感觉设计模式是一个高端的东西,到底什么是设计模式呢?其实设计模式也就是我们的前辈在写代码的时候遇到的问题,提出的解决方案,为了方便人与人之间的交流,取了个名字,叫做设计模式. ...

  3. php开发面试题---创建型设计模式1(创建型设计模式有哪几种)

    php开发面试题---创建型设计模式1(创建型设计模式有哪几种) 一.总结 一句话总结: 共五种:(简单工厂模式).工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 1.学设计模式最好的方 ...

  4. [Python编程实战] 第一章 python的创建型设计模式1.1抽象工厂模式

    注:关乎对象的创建方式的设计模式就是“创建型设计模式”(creational design pattern) 1.1 抽象工厂模式 “抽象工厂模式”(Abstract Factory Pattern) ...

  5. 原型模式 prototype 创建型 设计模式(七)

    原型模式  prototype 意图 用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象   显然,原型模式就是给出一个对象,然后克隆一个或者更多个对象 小时候看 ...

  6. 创建型设计模式之单例模式(Singleton)

     结构 意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 适用性 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更 ...

  7. Java内功心法,创建型设计模式包括哪些

    1. 单例(Singleton) Intent 确保一个类只有一个实例,并提供该实例的全局访问点. Class Diagram 使用一个私有构造函数.一个私有静态变量以及一个公有静态函数来实现. 私有 ...

  8. 创建型设计模式之原型模式(Prototype)

    结构   意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性 当要实例化的类是在运行时刻指定时,例如,通过动态装载:或者 为了避免创建一个与产品类层次平行的工厂类层次时:或 ...

  9. 创建型设计模式之建造者模式(Builder)

    结构 意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 适用性 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. 当构造过程必须允许被构造的对象有不 ...

  10. 创建型设计模式之工厂模式(Abstract Factory)

    结构            意图         提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性     一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个 ...

随机推荐

  1. 初识Node和内置模块

    初识Node与内置模块 概述:了解Node.js,熟悉内置模块:fs模块.path模块.http模块 初识Node.js 浏览器中的JavaScript运行环境 运行环境是指代码正常运行所需的必要环境 ...

  2. 存算分离实践:JuiceFS 在中国电信日均 PB 级数据场景的应用

    01- 大数据运营的挑战 & 升级思考 大数据运营面临的挑战 中国电信大数据集群每日数据量庞大,单个业务单日量级可达到 PB 级别,且存在大量过期数据(冷数据).冗余数据,存储压力大:每个省公 ...

  3. NX二次开发:保存时导出PDF并打开

    该工程为在保存时执行开发的功能,函数入口点ufput.其他还有新建.打开.另存等都可以加入开发的操作,具体看UF_EXIT下的介绍. 用户出口是一个可选特性,允许你在NX中某些预定义的位置(或出口)自 ...

  4. JMM内存模型

    ● 说说JVM的主要组成部分以及作用? 类加载器.运行时数据区.执行引擎.本地库接口 类加载器子系统 它主要功能是处理类的动态加载,还有链接,并且在第一次引用类时进行初始化. Loading - 加载 ...

  5. vue中新的状态管理器-pinia

    背景 对于pinia的使用,可参考官方文档在这不做过多赘述.这边主要来讲讲pinia中 少用且好用的方法,为什么我们选择pinia而不用vuex ps: 以下写法全部基于组合式API 使用方式: 先下 ...

  6. Redis面试必问题(一)缓存穿透、缓存击穿、缓存雪崩

    一.缓存穿透(数据库没有,缓存没有) 1.概念 当查询Redis中没有数据时,该查询会下沉到数据库层,同时数据库层也没有该数据,当出现大量这种查询(或被恶意攻击)时,接口的访问全部透过Redis访问数 ...

  7. MySQL相关知识点思维导图整理

    MySQL相关知识点思维导图整理 Xmind思维导图下载地址: 蓝奏云:https://shuihan.lanzoui.com/iXZw7frkn5a

  8. 一条SQL语句在MySQL中如何执行

    一条SQL语句在MySQL中如何执行 本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的. 在分析之前我会 ...

  9. R语言文本挖掘细胞词库的转换

    搜狗细胞词库解析 一. 加载R包转换 library(rJava) library(Rwordseg) write.csv(as.data.frame(importSogouScel('wuliu.s ...

  10. KubeSphere 高可用集群搭建并启用所有插件

    介绍 大多数情况下,单主节点集群大致足以供开发和测试环境使用.但是,对于生产环境,您需要考虑集群的高可用性.如果关键组件(例如 kube-apiserver.kube-scheduler 和 kube ...