当前位置:网站首页>创建型模式 - 单例模式Singleton
创建型模式 - 单例模式Singleton
2022-08-02 21:43:00 【Xiaohei.Wang(Wenhao)】
单例模式的定义与特点
创建型模式:
单例模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。
例如,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 (记得备注),大家一起进步
今日无推荐
- 客官,看完get之后记得点赞哟!
- 小伙伴你还想要别的知识?好的呀,分享给你们
- 小黑的杂货铺,想要什么都有,客官不进来喝杯茶么?
边栏推荐
- 博客主题美化第二弹
- Ruoyi integrates minio to realize distributed file storage
- SSM整合步骤(重点)
- 面试了个985毕业的,回答“性能调优”题时表情令我毕生难忘
- 如何通过开源数据库管理工具 DBeaver 连接 TDengine
- 牛客刷题:数组排序
- FRED应用:激光二极管光源耦合到光纤的仿真
- 双轴晶体中的锥形折射
- TDengine 在中天钢铁 GPS、 AIS 调度中的落地
- JumpServer open source bastion machine completes Loongson architecture compatibility certification
猜你喜欢

Flink优化的方方面面

Flink优化及相关

Learn more TypeScript 】 【 TypeScript modular

Byte's internal technical map is amazing and practical

ML之PDP:基于titanic泰坦尼克是否获救二分类预测数据集利用PDP部分依赖图对RF随机森林和LightGBM模型实现可解释性案例

How to seize the new trend of NFT, yuan|universe|universe?

Sentinel vs Hystrix 限流对比,到底怎么选?

SSM整合步骤(重点)

网络运维系列:健康检查的方式

win10安全中心设置不扫描某个文件夹的方法
随机推荐
同样月薪6K,为什么同事跳槽月薪翻倍,而你只涨了1000?
RuoYi-App启动教程
SSM整合步骤(重点)
源码构建LAMP环境-3
饥荒联机版Mod开发——制作简单的物品(三)
SSM integration steps (emphasis)
JumpServer open source bastion machine completes Loongson architecture compatibility certification
iptables、firewalld的使用
golang刷leetcode:到达角落需要移除障碍物的最小数目
谷粒商城-day13-es和商品上架
Matplotlib drawing core principles explain (more detailed)
终于明白:有了线程,为什么还要有协程?
Abstract Factory Pattern
CS5213芯片|HDMI to VGA转换头芯片资料分享
RuoYi-App Startup Tutorial
JS 包装类 Math对象 round max() min() random
圆锥折射作为偏振计量工具的模拟
Auto.js实现朋友圈自动点赞
软件测试到底自学还是报班?
【DEBUG】ImportError: Unable to import required dependencies: numpy: DLL load failed: 找不到指定的模块。