2.C#设计模式系列01_单例模式_Singleton
时间:2021-07-21
本文章向大家介绍2.C#设计模式系列01_单例模式_Singleton,主要包括2.C#设计模式系列01_单例模式_Singleton使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言:单例模式个人觉得是比较容易理解,而且面试比较容易遇到,但是在实际生产中要慎用的一种设计模式,以前总觉得很难,系统的了解了下,主要有以下几种写法
1.双if + lock
1 public class SingletonModel { 2 3 private static SingletonModel instance = null; 4 private static object singleton_lock = new object(); 5 private SingletonModel() { 6 Console.WriteLine("构造函数"); 7 } 8 9 //多线程测试 10 public static SingletonModel SingletonCreatInstance() { 11 if (instance == null){ 12 lock (singleton_lock){ 13 if (instance == null){ 14 instance = new SingletonModel(); 15 } 16 } 17 } 18 return instance; 19 } 20 }
2.静态成员变量
public class SingletonTwo{ private static SingletonTwo slModel = new SingletonTwo(); private SingletonTwo() { Console.WriteLine("构造函数"); } public static SingletonTwo CreateInstanceTwo{ get{ return slModel; } } }
3.静态构造函数
public class SingletonOne { //静态构造函数 private static SingletonOne slModel =null; static SingletonOne(){ slModel = new SingletonOne(); Console.WriteLine("构造函数"); } public static SingletonOne CreateInstance() { return slModel; } }
4.Lazy延时加载
public class SingletonThree { private static Lazy<SingletonThree> lazyModel = new Lazy<SingletonThree>(() => new SingletonThree()); private SingletonThree(){ } public static SingletonThree CreatInstance() { return lazyModel.Value; } }
public class SingletonFour{ private static Lazy<SingletonFour> lazyModel; private SingletonFour(){ } static SingletonFour() { lazyModel = new Lazy<SingletonFour>(new SingletonFour()); } public static SingletonFour CreatInstance() { return lazyModel.Value; } }
总结:
套路无非就是 1.私有构造函数或者静态构造函数 + 2.私有静态成员变量 + 3.公共对外的访问实例方法 ,然后根据实际情况选择合适的用法
ps:Lazy 用法个人感觉使用静态成员变量和静态构造是一样的
本文来自博客园,作者:碧水孤鹜,转载请注明原文链接:https://www.cnblogs.com/wandefour/p/15038587.html,请各位大佬多多教诲
原文地址:https://www.cnblogs.com/wandefour/p/15038587.html
- Java Web基础入门
- Java中Optional使用注意事项
- 使用awk来解析dump文件 (73天)
- IntelIj IDEA运行JUnit Test OutOfMemoryError
- git pull fails “unable to resolve reference” “unable to update local ref”
- 使用dropwizard(5)--加入swagger
- 使用hint来调优sql语句(72天)
- 用R语言对城管事件数据分析
- 使用dropwizard(4)-加入测试-jacoco代码覆盖率
- goldengate学习-安装篇(71天)
- 使用dropwizard(6)-国际化-easy-i18n
- 配置不同环境下启用swagger,在生产环境关闭swagger
- 使用ControllerAdvice注意事项,Ambiguous @ExceptionHandler method mapped for [class org.springframework.web.
- rac节点无法启动ORA-29702的问题及分析(70天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- WordPress调用分类目录 及输出当前分类下的二级目录 和分类文章数量显示
- CSS让Li标签溢出后自动换行
- docker里运行docker命令
- 一次性实战java8 新特性(全)—— Lambda、Optional、stream、DateTime
- 面试Python高频问题汇总
- python自学成才之路 miniconda创建虚拟环境
- 逐行阅读Spring5.X源码(一) BeanDefinition,起点
- linux 磁盘占满 查看占用
- 逐行阅读Spring5.X源码(二) BeanDefinition的父接口-AttributeAccessor 、BeanMetadataElement ,进阶
- 64. Vue中的插槽slot
- 65. Vue中的作用域插槽
- SpringBoot : 全局异常配置
- springboot事务管理
- Java : 分享一个通用的获取请求客户端IP的方法
- 一套常用的css初始化样式