【创建型模式】单例模式

一、单例模式概述

        单例模式的定义又叫单件模式,确保一个类只有一个实例,并提供一个全局访问点(对象创建型)

  • 要点
    • 1.某个类只能有一个实例;
    • 2.必须自行创建这个实例;
    • 3.必须自行向整个系统提供这个实例。
  • 单例模式的优缺点
    • 优点:
      • 1.提供了对唯一实例的受控访问
      • 2.可以节约系统资源,提高系统的性能
      • 3.允许可变数目的实例(多例类)
    • 缺点:
      • 1. 全局变量:单例模式实质上就是全局变量。全局变量可能会被误修改,而且调试困难;
      • 2. 并发问题:在多线程环境下,如果没有正确地处理,可能会导致多个实例被创建;
      • 3.单例类通常承担了太多的职责,因为为了让某个类的对象共享,就把这个类设计成了单例类,这违反了单一职责原则.
  • 适用环境
    • 1.系统只需要一个实例对象,或者因为资源消耗太大而只允许创建一个对象
    • 2.客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例
  • 饿汉式单例类与懒汉式单例类的比较
    • 饿汉式
      • 1.无需考虑多个线程同时访问的问题;
      • 2.调用速度和反应时间优于懒汉式单例;
      • 3.资源利用率不及懒汉式单例;
      • 4.系统加载时间可能会比较长。
    • 懒汉式
      • 1.实现了延迟加载;
      • 2.必须处理好多个线程同时访问的问题;
      • 3.需要通过双重检查锁定等机制进行控制,将导致系统性能受到一定的影响。

二、代码实现

        单例模式只有一个角色:单例角色

        2.1 单例角色(LoadBalancer)
//designpatterns.singleton.LoadBalancer.java
package singleton;
import java.util.*;//负载均衡器类,充当单例角色
public class LoadBalancer {//私有静态成员变量,存储唯一实例private static LoadBalancer instance = null;//服务器集合private List serverList = null;//私有构造函数private LoadBalancer() {serverList = new ArrayList();}//公有静态成员方法,返回唯一实例public static LoadBalancer getLoadBalancer() {if (instance == null) {instance = new LoadBalancer();}return instance;}//增加服务器public void addServer(String server) {serverList.add(server);}//删除服务器public void removeServer(String server) {serverList.remove(server);}//使用Random类随机获取服务器public String getServer() {Random random = new Random();int i = random.nextInt(serverList.size());return (String)serverList.get(i);}
}
        2.2 main方法实现单例模式(Client)
//designpatterns.singleton.Client.java
package singleton;//客户端测试类
public class Client {public static void main(String args[]) {//创建4个LoadBalancer对象LoadBalancer balancer1,balancer2,balancer3,balancer4;balancer1 = LoadBalancer.getLoadBalancer();balancer2 = LoadBalancer.getLoadBalancer();balancer3 = LoadBalancer.getLoadBalancer();balancer4 = LoadBalancer.getLoadBalancer();//判断服务器负载均衡器是否相同if (balancer1 == balancer2 && balancer2 == balancer3 && balancer3 == balancer4) {System.out.println("服务器负载均衡器具有唯一性!");}//增加服务器balancer1.addServer("Server 1");balancer1.addServer("Server 2");balancer1.addServer("Server 3");balancer1.addServer("Server 4");//模拟客户端请求的分发,如果输出结果全为同一个server,可以将i适当放大,//例如改为"i < 100"for (int i = 0; i < 10; i++) {String server = balancer1.getServer();System.out.println("分发请求至服务器: " + server);}}
}

三、代码结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

固体矿产资源储量分类GBT17766-2020

1999分类标准采用三轴体系划分资源量与处理&#xff0c;表达复杂、经济意义划分过细、实用性不强 虽然不再采用”三轴“表达方式&#xff0c;但依然考虑地质可靠程度、经济意义、可行性评价 矿产资源勘查&#xff1a;通常依靠地球科学知识&#xff0c;运用地质填图&#xff0…

vue中,为什么data属性是一个函数,而不是一个对象?

vue中&#xff0c;为什么data属性是一个函数&#xff0c;而不是一个对象&#xff1f; vue2中&#xff0c;data是一个函数&#xff0c;而不是一个对象的原因&#xff0c;与组件的复用和独立性有关。 在vue中定义一个组件时&#xff0c;这个组件可能会被多次复用&#xff0c; …

python语言零基础入门——变量与简单数据类型

目录 一、变量 1.创建变量 2.变量的修改 3.变量的命名 &#xff08;1&#xff09;常量 &#xff08;2&#xff09;标识符 &#xff08;3&#xff09;关键字 &#xff08;4&#xff09;命名规则 二、简单数据类型 1.变量的数据类型 2.数据类型 3.整型&#xff08;In…

软考-系统集成项目管理中级--项目人力资源管理(输入输出很重要!!!本章包含案例题,着重复习)

本章历年考题分值统计 本章重点常考知识点汇总清单(掌握部分可直接理解记忆) 1、人力资源管理的过程:(掌握) (1)项目人力资源计划编制:确定与识别项目中的角色、分配项目职责和汇报关系&#xff0c;并记录下来形成书面文件&#xff0c;其中也包括项目人员配备管理计划。…

C语言进阶课程学习记录-第39课 - 程序中的3个基本数据区

C语言进阶课程学习记录-第39课 - 程序中的3个基本数据区 栈实验-栈空间释放后数据无效堆静态存储区实验-静态变量和全局变量小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 栈 实验-栈空间释放后数据…

吴恩达机器学习笔记:第 8 周-13 聚类(Clustering)13.1-13.2

目录 第 8 周 13、 聚类(Clustering)13.1 无监督学习&#xff1a;简介 第 8 周 13、 聚类(Clustering) 13.1 无监督学习&#xff1a;简介 在这个视频中&#xff0c;我将开始介绍聚类算法。这将是一个激动人心的时刻&#xff0c;因为这是我们学习的第一个非监督学习算法。我们…

typescript 问号使用(??)(?.)

问号点&#xff08;?.&#xff09; 对象不为空才调用对象的属性。如果对象为空则返回undefined。 res.data.mstrmod?.CreateTime 如果mstrmod为空&#xff0c;createTime得到一个undefine 以下的如果createTime得到undefine再调用replace是会报错 &#xff0c;?.只能用来取值…

Day3 权限管理

Day3 权限管理 这里会总结构建项目过程中遇到的问题&#xff0c;以及一些个人思考&#xff01;&#xff01; 学习方法&#xff1a; 1 github源码 文档 官网 2 内容复现 &#xff0c;实际操作 项目源码同步更新到github 欢迎大家star~ 后期会更新并上传前端项目 创建管理员…

yolov5调用zed相机实现三维社交距离检测(单类别)

yolov5调用zed相机实现单类别三维社交距离检测(python) 1. 相关配置2. 相关代码2.1 测距代码2.2 不同类别社交距离检测2.3 主代码zed_distance.py3. 实验结果4. 源码下载相关链接 此项目直接调用zed相机实现三维测距,无需标定,相关内容如下: 1. yolov4直接调用zed相机实现…

Windows的Tensorrt的安装

Tensorrt的下载 确定自己的CUDA版本,匹配的去下载Tensorrt。 Tensorrt的下载 下载完成之后,直接解压到文件夹即可。 环境变量配置 最重要的一部就是环境变量的配置。 官方的安装指导文件给出了两种方法: (1)要么直接将/lib 添加到环境变量 PATH 中 (诶,windows没有LD_L…

[AI Meta Llama-3] 最强开源大模型Llama 3发布!

最强开源大模型Llama 3发布&#xff01;我们看下重点&#xff1a; 今天&#xff0c;我们介绍Meta Llama 3&#xff0c;这是我们最先进的开源大型语言模型的下一代。Llama 3模型很快将在AWS、Databricks、Google Cloud、Hugging Face、Kaggle、IBM WatsonX、Microsoft Azure、N…

C++:类的定义

目录 一、类的定义 1.1声明和定义分离 1.2声明和定义在一起 一、类的定义 class classname {//类体&#xff1a;类的成员函数和成员变量// };//类的后面要加分号 class为定义类的关键字&#xff0c;classname是定义的类的名称&#xff08;可自行定义&#xff09;&#xff0…

异步 IO 机制 io_uring

一、io_uring 原理 如何解决频繁 copy 的问题 → mmap 内存映射解决。 submit queue 中的节点和 complete queue 中的节点共用一块内存,而不是把 submit queue 中的节点 copy 到 complete queue 中。如何做到线程安全 → 无锁环形队列解决。二、io_uring 使用 内核为 io_uring…

Pytorch实用教程:nn.CrossEntropyLoss()的用法

在 PyTorch 中&#xff0c;nn.CrossEntropyLoss() 是一个非常常用且功能强大的损失函数&#xff0c;特别适合用于多类分类问题。这个损失函数结合了 nn.LogSoftmax() 和 nn.NLLLoss() (Negative Log Likelihood Loss) 两个操作&#xff0c;从而在一个模块中提供完整的交叉熵损失…

[qiankun]: Target container with #container not existed while childOne loading!

主应用container容器不存在导致无法挂载子应用 解决&#xff1a;不要将<div id"container"></div>放在Router标签内&#xff0c;跟Router同级即可

通过一系列vue-demo入门vue2

一、创建简单vue实例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible&…

2024年核科学与地球化学国际会议 (ICNSG 2024)

2024年核科学与地球化学国际会议 (ICNSG 2024) 2024 International Conference on Nuclear Science and Geochemistry 【会议简介】 2024年核科学与地球化学国际会议即将在北京召开。本次会议旨在汇聚全球核科学与地球化学领域的专家学者&#xff0c;共同探讨核科学的最新进展…

不是我说,这玩意也叫高可用?

背景&#xff1a;有人求助说数据库起不来了。原因是某个文件有问题&#xff08;可以理解为无法访问或者读写&#xff09;。我问有从库吗&#xff1f;说没有。这里的高可用架构是通过存储复制做的。然后高可用那端的文件也一样。听到这里随着这个系统不是我的&#xff0c;我都忍…

Django模型的字段类型

Django模型中最重要并且也是唯一必须执行的就是字段定义。字段在类中进行定义&#xff0c;对应于实体数据库的字段。另外&#xff0c;定义模型字段名时为了避免冲突&#xff0c;不建议使用模型API中已经定义的关键字。 字段类型用以指定数据库的数据类型&#xff0c;例如Integ…

美团外卖10元无门槛通用券怎么领取10元外卖通用红包?

词令公众号美团外卖红包天天领入口&#xff0c;首次使用的外卖新客可领取10元无门槛通用券&#xff0c;点餐使用即可享受优惠&#xff1b; 美团外卖10元无门槛通用券怎么领取&#xff1f; 1、关注「词令」公众号&#xff0c;回复「外卖红包」&#xff1b; 2、打开后立即领取外…