〇、简介

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

三、在 .NET 框架中的实际应用

下边是通过 object.GetType() 方法,获取对象的类型:

var test1 = new TestClass();
var test2 = new TestClass();
Type t1 = test1.GetType();
Type t2 = test2.GetType();
Console.WriteLine($"t1 == t2 : {t1 == t2}"); // t1 == t2 : True

根据以上示例,t1、t2 指向的是同一个对象,因此 object.GetType() 针对同一类型只生成一个 Type 对象。

Singleton Pattern 单例模式简介与 C# 示例【创建型】【设计模式来了】的更多相关文章

  1. Python Singleton Pattern(单例模式)

    简介 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 当 ...

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

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

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

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

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

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

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

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

  6. Singleton Pattern单例模式

    单例模式是一种对象创建模式,它用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例.Java里面实现的单例是一个虚拟机的范围,因为装载类的功能是虚拟机的,所以一个虚拟机在通过自己的 Cla ...

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

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

  8. Singleton Pattern(单例模式)

    1.简介 单例模式,顾名思义,即在整个系统中,类的实例对象只有一个. 单例模式具有以下特点: 单例类只能有一个实例 单例类必须自己创建自己的唯一实例 单例类必须给所有其他对象提供这一实例 2.实现 其 ...

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

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

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

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

随机推荐

  1. 【学习笔记】【题解】树形依赖 DP 选做

    地址:https://www.cnblogs.com/FReQuenter5156/p/shuxingyilaidp.html/ 简介 这类背包本质上是分组背包问题. 将一个节点的每一棵子树看作一组, ...

  2. 【Docker】安装及部署

    一.Ubuntu使用apt安装Docker 官方安装文档:https://docs.docker.com/engine/install/ubuntu/ 1.准备安装环境 [root@Docker-Ub ...

  3. 通过空间占用和执行计划了解SQL Server的行存储索引

    1 索引介绍 索引是一种帮助查询语句能够快速定位到数据的一种技术.索引的存储方式有行存储索引.列存储索引和内存优化三种存储方式: 行存储索引,使用B+树结构,行存储指的是数据存储格式为堆.聚集索引和内 ...

  4. 2020-10-14:Redisson分布式锁超时自动释放,会有什么问题?

    福哥答案2020-10-14:#福大大架构师每日一题# [知乎:](https://www.zhihu.com/question/425541402) 如果线程1的锁被自动释放了,临界区的逻辑还没执行 ...

  5. 2022-02-21:不含连续1的非负整数。 给定一个正整数 n ,返回范围在 [0, n] 都非负整数中,其二进制表示不包含 连续的 1 的个数。 输入: n = 5 输出: 5 解释: 下面是带

    2022-02-21:不含连续1的非负整数. 给定一个正整数 n ,返回范围在 [0, n] 都非负整数中,其二进制表示不包含 连续的 1 的个数. 输入: n = 5 输出: 5 解释: 下面是带有 ...

  6. 2021-12-01:给定一个正数数组arr,代表每个人的体重。给定一个正数limit代表船的载重,所有船都是同样的载重量。 每个人的体重都一定不大于船的载重。 要求: 1, 可以1个人单独一搜船;

    2021-12-01:给定一个正数数组arr,代表每个人的体重.给定一个正数limit代表船的载重,所有船都是同样的载重量. 每个人的体重都一定不大于船的载重. 要求: 1, 可以1个人单独一搜船: ...

  7. 2021-11-23:规定:L[1]对应a,L[2]对应b,L[3]对应c,...,L[25]对应y。 S1 = a, S(i) = S(i-1) + L[i] + reverse(invert(S(

    2021-11-23:规定:L[1]对应a,L[2]对应b,L[3]对应c,-,L[25]对应y. S1 = a, S(i) = S(i-1) + L[i] + reverse(invert(S(i- ...

  8. vue全家桶进阶之路2:JavaScript

    JavaScript(简称"JS")是当前最流行.应用最广泛的客户端脚本语言,用来在网页中添加一些动态效果与交互功能,在 Web 开发领域有着举足轻重的地位.JavaScript ...

  9. asp.net WebApi JWT

    文章转自 https://blog.csdn.net/liwan09/article/details/83820651 参考资料: https://docs.microsoft.com/en-us/a ...

  10. linux 管理进程和计划任务

    目录 一.进程原理 二.进程工作过程 三.进程类型 四.管理进程 五.前后台调度 六.定时任务 七.管理定时任务 一.进程原理 进程:指正在运行的程序称之为进程 程序:指的是没有运行的代码 线程:真正 ...