单例模式
2021/11/24 23:13:58
本文主要是介绍单例模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
编辑说明
概述
保证一个类仅有一个实例,并提供一个访问它的全局访问点
懒汉式模式
该模式的特点是类加载时没有生成单例
饿汉式模式
该模式的特点是类一旦加载就创建一个单例
结构图
代码实现
饿汉单例
单例类
/// <summary> /// 饿汉模式 /// </summary> public class Singleton1 { private static readonly Singleton1 instance = new Singleton1(); private Singleton1() { Console.WriteLine("创建了Singleton1实例"); } public static Singleton1 GetInstance() { return instance; } }
客户端
class Program { static void Main(string[] args) { Singleton1 s1 = Singleton1.GetInstance(); Singleton1 s2 = Singleton1.GetInstance(); if (s1 == s2) { Console.WriteLine("两个是同一个对象"); } Console.Read(); } }
运行结果
懒汉模式加锁加双重检测
单例类
/// <summary> ///懒汉模式加锁加双重检验 /// </summary> public class Singleton2 { private static Singleton2 instance; private static readonly object syncRoot = new object(); private Singleton2() { Console.WriteLine("创建了Singleton2实例"); } public static Singleton2 GetInstance() { if (instance == null) { lock (syncRoot) { if (instance == null) { instance = new Singleton2(); } } } return instance; } }
客户端
class Program { static void Main(string[] args) { Singleton2 s1 = Singleton2.GetInstance(); Singleton2 s2 = Singleton2.GetInstance(); if (s1 == s2) { Console.WriteLine("两个是同一个对象"); } Console.Read(); } }
运行结果
静态内部类
单例类
/// <summary> /// 静态内部类懒汉模式同时线程安全 /// </summary> public class Singleton3 { private static class SingletonHolder { public static readonly Singleton3 instance = new Singleton3(); } private Singleton3() { Console.WriteLine("创建了Singleton3实例"); } public static Singleton3 GetInstance() { return SingletonHolder.instance; } }
客户端
class Program { static void Main(string[] args) { Singleton3 s1 = Singleton3.GetInstance(); Singleton3 s2 = Singleton3.GetInstance(); if (s1 == s2) { Console.WriteLine("两个是同一个对象"); } Console.Read(); } }
运行结果
多利模式
多利类
/// <summary> /// 静态内部类懒汉模式同时线程安全 /// </summary> public class Singleton4 { private static class SingletonHolder { public static readonly Dictionary<string, Singleton4> instances = new Dictionary<string, Singleton4>() { ["key1"] = new Singleton4(), ["key2"] = new Singleton4(), ["key3"] = new Singleton4(), }; } private Singleton4() { Console.WriteLine("创建了Singleton4实例"); } public static Singleton4 GetInstance(string key) { return SingletonHolder.instances.TryGetValue(key, out _) ? SingletonHolder.instances[key] : null; } }
客户端
class Program { static void Main(string[] args) { Singleton4 s1 = Singleton4.GetInstance("key1"); Singleton4 s2 = Singleton4.GetInstance("key1"); if (s1 == s2) { Console.WriteLine("两个是同一个对象"); } Console.Read(); } }
运行结果
优势
单例模式可以保证内存里只有一个实例,减少了内存的开销。
可以避免对资源的多重占用。
单例模式设置全局访问点,可以优化和共享资源的访问。
使用场景
一个全局使用的类频繁地创建与销毁。
要求全局只生产一个
创建的一个对象需要消耗的资源过多。
单例模式还可以在集群、进程间来保证单例
缺陷
单例模式一般没有接口,扩展困难。如果要扩展,则除了修改原来的代码,没有第二种途径,违背开闭原则。
Demo
这篇关于单例模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)