当前位置: 首页 > news >正文

单例模式(Singleton Pattern)

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace DesignPattern.SingletonPattern
 7 {
 8     /// <summary>
 9     /// 地球只有一个吧??所以单例一个地球
10     /// </summary>
11     class Earth
12     {
13         /// <summary>
14         /// 在大多数情况下,静态初始化是在 .NET 中实现 Singleton 的首选方法。
15         /// </summary>
16         private static readonly Earth singleton = new Earth();
17 
18         private Earth()
19         {
20         }
21 
22         public static Earth getEarth()
23         {
24             return singleton;
25         }
26 
27         /// <summary>
28         /// 公开一个全局方法,下雨~!
29         /// </summary>
30         public void Rain()
31         {
32             Console.WriteLine("哗啦啦啦天在下雨!!!!");
33         }
34 
35     }
36 
37     /// <summary>
38     /// 线程安全的单例,延迟加载,双重校验锁
39     /// </summary>
40     public class Singleton
41     {
42         private static Singleton singleton = null;
43         static readonly object lazylock = new object();
44         public static Singleton getInstance()
45         {
46             if (singleton == null)
47             {
48                 lock (lazylock)
49                 {
50                     if (singleton == null)
51                     {
52                         singleton = new Singleton();
53                     }
54                 }
55             }
56             return singleton;
57         }
58     }
59 }

 

Earth earth = Earth.getEarth();
earth.Rain();

 

优点:
减少内存开支
减少性能开销
避免资源多重占用
拥有全局访问点

缺点:
一般没有接口,难以扩展。
测试不利,没有接口无法mock

使用场景:
整个项目需要一个共享访问点,共享数据
创建的对象需要消耗资源过多
需要定义大量的静态常量和方法(工具类)

最佳实践:
如果单例在内存长久不使用,则会被认为是垃圾而销毁,可以由容器管理单例的生命周期,也可以记录状态变化,确保重新初始化之后获得销毁前的数据,,避免丢失。

转载于:https://www.cnblogs.com/leestar54/p/5800161.html

相关文章:

  • HDU(2485),最小割最大流
  • iOS 对模型对象进行归档
  • TopN算法与排行榜
  • Servlet 生命周期、工作原理
  • POJ 2375
  • 关于SQL镜像配置报错
  • 共享库
  • Oracle 函数返回表实例2种写法实例
  • 重走java--Step 2
  • 高并发系统之队列术
  • servlet 开发出错原因分析
  • java--集合框架
  • 粗浅看Struts2和Hibernate框架
  • Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
  • jquery内容选择器(匹配包含指定选择器的元素)
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • android 一些 utils
  • Android交互
  • HTTP请求重发
  • Java 最常见的 200+ 面试题:面试必备
  • mac修复ab及siege安装
  • magento 货币换算
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • webpack入门学习手记(二)
  • zookeeper系列(七)实战分布式命名服务
  • 观察者模式实现非直接耦合
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 聚簇索引和非聚簇索引
  • 模型微调
  • 前端代码风格自动化系列(二)之Commitlint
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 跳前端坑前,先看看这个!!
  • 王永庆:技术创新改变教育未来
  • 我的zsh配置, 2019最新方案
  • 我是如何设计 Upload 上传组件的
  • 小程序开发中的那些坑
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 译自由幺半群
  • 责任链模式的两种实现
  • kubernetes资源对象--ingress
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​第20课 在Android Native开发中加入新的C++类
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #{}和${}的区别是什么 -- java面试
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (待修改)PyG安装步骤
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (动态规划)5. 最长回文子串 java解决
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (论文阅读笔记)Network planning with deep reinforcement learning