单例模式的定义与特点

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

例如,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. Spring boot pom 配置文件

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  2. 所有selenium相关的库

    通过爬虫 获取 官方文档库 如果想获取 相应的库 修改对应配置即可 代码如下 from urllib.parse import urljoin import requests from lxml im ...

  3. 【Azure 环境】把OpenSSL生产的自签名证书导入到Azure Key Vault Certificate中报错

    问题描述 通过本地生成的自签名证书导入到Azure Key Vault Certificate报错. 错误信息 the specified PEM X.509 certificate content ...

  4. 读Bilgin Ibryam 新作 《Dapr 是一种10倍数 平台》

    Bilgin Ibryam 最近加入了开发者软件初创公司Diagrid Inc,他是Apache Software Foundation 的 committer 和成员.他也是一个开源的布道师,并且是 ...

  5. (工具) 性能测试基准软件 lmBench (待补充)

    1. lmBench 介绍 Lmbench是一套简易,可移植的,符合ANSI/C标准为UNIX/POSIX而制定的微型测评工具.一般来说,它衡量两个关键特征:反应时间和带宽.Lmbench旨在使系统开 ...

  6. Ubuntu环境下LLVM 15.0 完全编译 附windows编译LLVM master

    1. 预先安装 sudo apt install ninja-build sudo apt install llvm clang # 第一次编译需要 sudo apt-get install libn ...

  7. svn 日常使用的错误集锦

    1.SVN:Previous operation has not finished; run 'cleanup' if it was interrupted 当时遇到这个问题时,找了各种解决方案什么要 ...

  8. springcloudgateway学习

    API网关 大型项目开发过程中,往往都是由各个不同的微服务组成的,服务可能分布在不同地区不同机房,那用户如何知道访问某服务的时候该服务的实际地址呢,这时候就需要API网关了 API 网关就像服务的门面 ...

  9. org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException

    1.问题概述 将一个 springboot 项目打成 Jar 包后,在本地使用 java -jar 命令启动服务,服务能启动成功,但是会有如下报错信息. 说明: 配置文件为外置配置文件,与 jar 处 ...

  10. Linux 系统用户文件缺失造成“bash-4.2$”错误的解决办法

    一.问题出现的原因 造成这个现象的原因是因为用户文件夹下的bash_logout.bash_profile和bashrc这三个隐藏文件缺失 二.问题复现 现在删除这三个文件 此时问题出现了 三.问题解 ...