单例模式的定义与特点

创建型模式:
        单例模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。

例如,Windows中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。

在计算机系统中,还有Windows的回收站、操作系统中的文件系统、多线程中的线程池、显卡的驱动程序对象、打印机的后台处理服务、应用程序的日志对象、数据库的连接池、网站的计数器、Web 应用的配置对象、应用程序中的对话框、系统中的缓存等常常被设计成单例。

单例模式有3个特点:

  • 单例类只有一个实例对象
  • 该单例对象必须由单例类自行创建
  • 单例类对外提供一个访问该单例的全局访问点

单例模式的优点和缺点

优点:

  • 单例模式可以保证内存中只有一个实例对象,减少了内存的开销
  • 避免了对资源的多重占用
  • 单例模式的全局访问点,优化了对共享资源的访问

缺点:

  • 没有接口,扩展困难。如需扩展,则需修改原有代码,这违背了开闭原则
  • 在并发测试中,单例模式不利于代码调试
  • 单例模式的功能全部在一个类中、如果功能设计不合理,很容易违背单一职责原则

学习代码:

namespace StudyDesignMode.Singleton
{
/// <summary>
/// 单例基类,防多线程问题
/// </summary>
/// <typeparam name="T"></typeparam>
public class Singleton<T> where T : class
{
protected Singleton() { }
public static readonly T Instance = new Lazy<T>(() => (T)Activator.CreateInstance(typeof(T), true)).Value;
} /// <summary>
/// 懒汉模式
/// </summary>
public class SingletonL
{
#region 懒汉模式
SingletonL instance;
public SingletonL GetInstance()
{
if (null == instance)
instance = new SingletonL();
return instance;
}
#endregion
}
/// <summary>
/// 饿汉模式
/// </summary>
public class SingletonE
{
#region 饿汉模式
SingletonE instance = new SingletonE();
public SingletonE GetInstance()
{
return instance;
}
#endregion
} /// <summary>
/// 内部静态模式
/// </summary>
public class SingletonJ
{
#region 内部静态类 //没啥卵用
private SingletonJ() { }
public static SingletonJ getInstance()
{
return InnerClass.instance;
} public static class InnerClass
{
public static readonly SingletonJ instance = new SingletonJ();
}
#endregion
} //========================================多地方吃亏而得.==================================
/// <summary>
/// 多线程安全的单例模式
/// </summary>
public class SingletonA
{
private SingletonA() { }
private volatile static SingletonA m_instance;
public static SingletonA Instance()
{
if (null == m_instance)
{
lock (new object())
{
if (null == m_instance)
{
m_instance = new SingletonA();
}
}
}
return m_instance;
}
} /// <summary>
/// 系统懒加载式创建
/// </summary>
public class SingletonLazy
{
private SingletonLazy() { }
public static readonly SingletonLazy Instance =
new Lazy<SingletonLazy>(
new Func<SingletonLazy>(() => new SingletonLazy())
).Value;
}
}

希望大家:点赞,留言,关注咯~    

唠家常

  • Xiaohei.Wang(Wenhao)的今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加我的QQ:841298494 (记得备注),大家一起进步

今日无推荐

创建型模式 - 单例模式Singleton的更多相关文章

  1. 设计模式01 创建型模式 - 单例模式(Singleton Pattern)

    参考 [1] 设计模式之:创建型设计模式(6种) | 博客园 [2] 单例模式的八种写法比较 | 博客园 单例模式(Singleton  Pattern) 确保一个类有且仅有一个实例,并且为客户提供一 ...

  2. [19/04/22-星期一] GOF23_创建型模式(单例模式)

    一.概念 <Design Patterns: Elements of Reusable Object-Oriented Software>(即后述<设计模式>一书),由 Eri ...

  3. &quot;围观&quot;设计模式(7)--创建型之单例模式(Singleton Pattern)

    单例模式,也叫单子模式,是一种经常使用的软件设计模式.在应用这个模式时,单例对象的类必须保证仅仅有一个实例存在. 很多时候整个系统仅仅须要拥有一个的全局对象.这样有利于我们协调系统总体的行为.比方在某 ...

  4. 创建型模式之Singleton模式

    单例模式大概是最直观的一种设计模式了,尽管直观却不简单. 数学与逻辑学中,singleton定义为“有且仅有一个元素的集合”, 单例模式可以如下定义:“一个类有且仅有一个实例,并且自行实例化向整个系统 ...

  5. java架构之路-(设计模式)五种创建型模式之单例模式

    设计模式自身一直不是很了解,但其实我们时刻都在使用这些设计模式的,java有23种设计模式和6大原则. 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可 ...

  6. 创建型模式(五) 原型模式(Prototype)

    一.动机(Motivation) 在软件系统中,经常面临着"某些结构复杂的对象"的创建工作:由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口.如何应对 ...

  7. 设计模式学习之单例模式(Singleton,创建型模式)(4)

    假如程序中有一个Person类,我的需求就是需要在整个应用程序中只能new一个Person,而且这个Person实例在应用程序中进行共享,那么我们该如何实现呢? 第一步: 新建一个Person类,类中 ...

  8. 设计模式01: Singleton 单例模式(创建型模式)

    Singleton 单例模式(创建型模式) 动机(Motivation)当进行软件开发是会有这样一种需求:在系统中只有存在一个实例才能确保它们的逻辑正确性.以及良好的效率.这应该是类设计者的责任,而不 ...

  9. 单例模式——创建型模式01

    1. 名称     单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类.单例模式是一种对象创建型模式. 2. 问题    ...

随机推荐

  1. 沁恒CH32V003(二): Ubuntu20.04 MRS和Makefile开发环境配置

    目录 沁恒CH32V003(一): CH32V003F4P6开发板上手报告和Win10环境配置 沁恒CH32V003(二): Ubuntu20.04 MRS和Makefile开发环境配置 硬件准备 沁 ...

  2. Intel GPU Gen 9 架构

    * 参考spec:the-compute-architecture-of-intel-processor-graphics-gen9-v1d0.pdf SOC 架构 Gen9 架构是早期用在igpu ...

  3. 试试将.NET7编译为WASM并在Docker上运行

    之前有听到说Docker支持Wasmtime了,刚好.NET7也支持WASM,就带大家来了解一下这个东西,顺便试试它怎么样. 因为WASM(WebAssembly) 一开始是一个给浏览器的技术,比起J ...

  4. dp入门30题

    前言:本文章主要记录一些 \(dp\) 入门题,都是我做过的,希望读者能从这些基础题中打好 \(dp\) 扎实的基础,有不足的地方也欢迎指出.大部分是 \(CodeFoces\) 和 \(Atcode ...

  5. dlv远端调试go的问题

    1.golang采用dlv 时提示 "could not launch process: could not open debug info " 在用dlv 远程debug 代码时 ...

  6. TreeUtils工具类一行代码实现列表转树 实战Java8 三级菜单 三级分类 附视频

    一.序言 在日常一线开发过程中,总有列表转树的需求,几乎是项目的标配,比方说做多级菜单.多级目录.多级分类等,有没有一种通用且跨项目的解决方式呢?帮助广大技术朋友给业务瘦身,提高开发效率. 本文将基于 ...

  7. 【云原生 · Kubernetes】KubeVirt热迁移

    [云原生 · Kubernetes]KubeVirt热迁移 检查节点和kubevirt状态 启用热迁移 创建虚拟机 在虚拟机上启动一个服务 迁移虚拟机 热迁移是KubeVirt支持的一个常见虚拟化特性 ...

  8. Scrum 框架的四个会议还适用于哪些敏捷方法?

    敏捷转型需要深入理解概念和思维,团队才能更好的进行实践.本文将通过介绍Scrum框架的四个会议还适用于哪些敏捷方法,来让大家更直观的理解敏捷转型. 本文整理自:PingCode 敏捷大学,转载请注明链 ...

  9. (Java)设计模式:行为型

    前言 此篇博文内容续接的是 UML建模语言.设计原则.创建型设计模式 的内容,有兴趣的可以点前面的链接去看一下 3.2.行为型 这类设计模式是专门用于:对象间的高效沟通和职责委派 * 3.2.1.责任 ...

  10. 2.6:Python数据存取-文件、文件夹及目录、数据库

    一.Python文件读写 1.文件的打开模式 <class '_io.TextIOWrapper'>和<class '_io.BufferedReader'>.python使用 ...