设计模式-注册模式

设计模式专栏

    • 模式介绍
    • 模式特点
    • 应用场景
    • 注册模式和单例模式的区别
    • 代码示例
      • Java实现注册模式
      • Python实现注册模式
    • 注册模式在spring中的应用


模式介绍

注册模式是一种设计模式,也称为注册树或注册器模式。这种模式将类的实例化和创建分离开来,避免在应用程序启动时实例化对象,以避免造成资源的浪费。

注册模式的核心思想是将类的创建和管理的代码封装到一个工厂类中,用户代码无需显式地通过“new”关键字实例化对象。相反,用户可以将类对象注册到全局的注册树上,这些对象就可以被应用程序中的任何地方访问。

使用注册模式的优势在于,它提供了一种集中管理对象的方式,避免了在每个需要使用对象的地方重复创建和销毁对象。此外,通过将对象的创建和销毁逻辑集中管理,可以更好地控制对象的生命周期,减少内存泄漏和性能问题。

此外,注册模式还可以与其他设计模式结合使用,例如与单例模式和工厂模式结合,以实现更加灵活和可扩展的对象创建和管理方式。

在这里插入图片描述

模式特点

  • 注册模式的优点包括:
  1. 集中管理 :注册模式将对象的创建和管理集中到一个地方,方便对对象进行统一管理和维护。
  2. 避免重复创建 :通过将对象注册到全局的注册树上,避免了在每个需要使用对象的地方重复创建和销毁对象,减少了资源浪费。
  3. 灵活扩展 :注册模式提供了注册和注销接口,方便用户动态添加或删除对象,使得应用程序更加灵活和可扩展。
  • 注册模式也存在一些缺点:
  1. 依赖管理 :注册模式需要管理对象的生命周期,因此需要谨慎处理对象的创建和销毁,避免出现内存泄漏等问题。
  2. 注册配置 :使用注册模式需要对每个对象进行注册配置,增加了开发的工作量。
  3. 性能开销 :虽然注册模式避免了重复创建对象,但在某些情况下,对象的创建和销毁仍然需要一定的性能开销。

因此,在使用注册模式时,需要根据实际情况进行权衡,并谨慎处理对象的生命周期和依赖关系。

在这里插入图片描述

应用场景

注册模式在以下场景中可能会得到应用:

  1. 插件扩展开发:在应用程序中,通常会有一些固定的功能模块,而插件可以在这些功能模块的基础上进行扩展,为应用程序提供更多的功能。通过注册模式,可以将应用程序中的各个功能模块、插件统一管理,从而提高应用程序的可维护性和扩展性。
  2. 模块化的程序设计:通过注册模式,开发者可以将应用程序中的各个模块、子系统相互依赖,从而进行模块化的程序设计。
  3. 跨集群注册发现:在多容器集群环境下,需要选择主备或者双活/多活模式,采用全容器注册或部署独立的注册发现中心,或者单一注册发现中心或每个集群都附属自己的注册发现中心,或者分层注册机制等。这种场景下,注册模式可以提供持续稳定的注册发现服务。
  4. API Gateway层API注册机制:API网关层提供API的注册,通过APIPortal提供API集市,通常适合有OpenAPI需求的场景,安全性方面要求相对比较高。

请注意,这些只是注册模式可能的应用场景,具体是否适用需要根据项目的具体需求和上下文来判断。

在这里插入图片描述

注册模式和单例模式的区别

注册模式单例模式是两种不同的设计模式,它们的主要区别在于实现方式和应用场景。

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点。单例模式通常用于创建系统中只需要一个实例的类,例如日志记录器、配置管理器等。单例模式通过在类中实现一个私有静态实例,并在类中提供公共静态方法来获取该实例,从而实现全局访问点。

注册模式是一种结构型设计模式,它提供了一种将对象创建和使用分离的方式。注册模式通过将对象注册到全局的注册表中,使得应用程序中的任何地方都可以通过注册表来获取和使用对象。注册模式通常用于创建可配置、可扩展的系统,例如插件系统、服务注册和发现等。

总的来说,单例模式关注的是如何创建唯一的实例,并提供全局访问点;而注册模式关注的是如何管理对象的创建和使用,提供一种灵活、可扩展的对象创建和使用方式。

在这里插入图片描述

代码示例

Java实现注册模式

以下是一个简单的Java示例,展示了如何实现注册模式:

import java.util.HashMap;
import java.util.Map;interface Service {void execute();
}class ConcreteServiceA implements Service {public void execute() {System.out.println("ConcreteServiceA is executing.");}
}class ConcreteServiceB implements Service {public void execute() {System.out.println("ConcreteServiceB is executing.");}
}class Registry {private Map<String, Service> services = new HashMap<>();public void registerService(String name, Service service) {services.put(name, service);}public Service getService(String name) {return services.get(name);}
}public class RegistrationPatternDemo {public static void main(String[] args) {Registry registry = new Registry();registry.registerService("serviceA", new ConcreteServiceA());registry.registerService("serviceB", new ConcreteServiceB());Service serviceA = registry.getService("serviceA");serviceA.execute(); // 输出: ConcreteServiceA is executing.Service serviceB = registry.getService("serviceB");serviceB.execute(); // 输出: ConcreteServiceB is executing.}
}

在这个示例中,我们定义了一个Service接口,以及两个实现了该接口的类ConcreteServiceAConcreteServiceB。我们还定义了一个Registry类,它使用一个Map来存储注册的服务。registerService方法用于注册服务,而getService方法用于根据名称获取服务。在main方法中,我们创建了一个Registry实例,注册了两个服务,并分别获取和执行它们。

Python实现注册模式

以下是一个Python实现注册模式的示例:

from abc import ABC, abstractmethod
from collections import defaultdictclass Service(ABC):@abstractmethoddef execute(self):passclass ConcreteServiceA(Service):def execute(self):print("ConcreteServiceA is executing.")class ConcreteServiceB(Service):def execute(self):print("ConcreteServiceB is executing.")class Registry:def __init__(self):self.services = defaultdict(list)def register_service(self, name, service):self.services[name].append(service)def get_service(self, name):return self.services.get(name, [])[0] if self.services.get(name) else None# 创建注册器实例
registry = Registry()# 注册服务
registry.register_service("serviceA", ConcreteServiceA())
registry.register_service("serviceB", ConcreteServiceB())# 获取并执行服务
serviceA = registry.get_service("serviceA")
serviceA.execute()  # 输出: ConcreteServiceA is executing.serviceB = registry.get_service("serviceB")
serviceB.execute()  # 输出: ConcreteServiceB is executing.

在这个示例中,我们定义了一个抽象基类Service,它包含一个抽象方法execute。然后,我们创建了两个实现了Service接口的类ConcreteServiceAConcreteServiceB。接下来,我们定义了一个Registry类,它使用一个字典来存储注册的服务。register_service方法用于注册服务,它将服务添加到字典中指定名称的列表中。get_service方法用于根据名称获取服务,它返回第一个注册的服务实例。在示例中,我们创建了一个Registry实例,注册了两个服务,并分别获取和执行它们。

在这里插入图片描述

注册模式在spring中的应用

Spring框架中使用了注册模式,主要是通过Spring的ApplicationContext来管理Bean。

Spring的ApplicationContext是一个接口,它实现了注册模式。在Spring中,Bean的创建和管理是通过ApplicationContext来完成的。当应用程序启动时,Spring会创建一个ApplicationContext实例,并将所有注册的Bean加载到该实例中。通过ApplicationContext,我们可以获取和操作这些Bean。

在Spring中,Bean的注册方式有多种,可以通过XML配置文件、注解或者JavaConfig类来实现。通过这些方式,我们可以将Bean定义并注册到Spring的容器中,并由Spring自动管理它们的生命周期和依赖关系。

在Spring中,注册模式的主要应用场景是解耦和模块化。通过将Bean注册到Spring容器中,我们可以将应用程序的不同模块解耦,使得它们之间相互独立,降低了代码的耦合度。同时,通过注册模式,我们可以实现插件化开发,使得应用程序可以根据需要动态添加或删除功能模块。

总之,Spring中的注册模式使得应用程序更加灵活、可扩展和可维护。

在这里插入图片描述

设计模式-迭代器模式

设计模式-责任链模式

设计模式-门面模式

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

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

相关文章

【广州华锐互动】VR科技科普展厅平台:快速、便捷地创建出属于自己的虚拟展馆

随着科技的不断进步&#xff0c;虚拟现实(VR)技术已经在许多领域取得了显著的成果。尤其是在展馆设计领域&#xff0c;VR科技科普展厅平台已经实现了许多令人瞩目的新突破。 VR科技科普展厅平台是广州华锐互动专门为企业和机构提供虚拟展馆设计和制作的在线平台。通过这个平台&…

Git基础学习_p1

文章目录 一、前言二、Git手册学习2.1 Git介绍&前置知识2.2 Git教程2.2.1 导入新项目2.2.2 做更改2.2.3 Git追踪内容而非文件2.2.4 查看项目历史2.2.5 管理分支&#x1f53a;2.2.6 用Git来协同工作2.2.7 查看历史 三、结尾 一、前言 Git相信大部分从事软件工作的人都听说过…

ASP.NET MVC的5种AuthorizationFilter

一、IAuthorizationFilter 所有的AuthorizationFilter实现了接口IAuthorizationFilter。如下面的代码片断所示&#xff0c;IAuthorizationFilter定义了一个OnAuthorization方法用于实现授权的操作。作为该方法的参数filterContext是一个表示授权上下文的AuthorizationContext对…

从计算机内存结构到iOS

一、冯.诺伊曼结构 当前计算机都是冯.诺伊曼结构&#xff08;Von Neumann architecture&#xff09;&#xff0c;是指存储器存放程序的指令以及数据&#xff0c;在程序运行时根据需要提供给CPU使用。 冯.诺伊曼瓶颈 在目前的科技水平之下&#xff0c;CPU与存储器之间的读写速…

挑战与应对:迅软科技探讨IT企业应对数据泄密危机的智慧之路

随着信息技术的快速发展&#xff0c;软件IT行业面临着前所未有的数据安全挑战。黑客攻击、病毒传播、内部泄密等安全威胁层出不穷&#xff0c;给企业的核心资产和运营带来严重威胁。同时&#xff0c;国家对于数据安全的法律法规也日益严格&#xff0c;要求企业必须采取更加有效…

https密钥认证、上传镜像实验

一、第一台主机通过https密钥对认证 1、安装docker服务 &#xff08;1&#xff09;安装环境依赖包 yum -y install yum-utils device-mapper-persistent-data lvm2 &#xff08;2&#xff09;设置阿里云镜像源 yum-config-manager --add-repo http://mirrors.aliyun.com/do…

VLAN简介

在配置交换机或者传输设备时&#xff0c;经常会提到vlan&#xff0c;这个vlan具体是啥呢&#xff1f; VLAN&#xff08;Virtual Local Area Network&#xff09;中文名为“虚拟局域网”。它是一种在物理网络上划分出逻辑网络的方法&#xff0c;将物理上的局域网在逻辑上划分为多…

设计模式——适配器模式(Adapter Pattern)

概述 适配器模式可以将一个类的接口和另一个类的接口匹配起来&#xff0c;而无须修改原来的适配者接口和抽象目标类接口。适配器模式(Adapter Pattern)&#xff1a;将一个接口转换成客户希望的另一个接口&#xff0c;使接口不兼容的那些类可以一起工作&#xff0c;其别名为包装…

分布式下有哪些好用的监控组件?

在之前的内容中&#xff0c;分析了分布式系统下的线上服务监控的常用指标&#xff0c;那么在实际开发中&#xff0c;如何收集各个监控指标呢&#xff1f;线上出现告警之后&#xff0c;又如何快速处理呢&#xff1f;本文我们就来看下这两个问题。 常用监控组件 目前分布式系统…

Node.js版本对比

目录 1. node版本与Npm版本对照表 2. node版本与node-sass版本对照表 3. node-sass与sass-loader版本对照表 1. node版本与Npm版本对照表 以往的版本 | Node.js 下面显示最新的对应内容&#xff0c;如果需要查找历史版本&#xff0c;可以进入上面的页面查询 VersionLTSDateV8np…

鸿蒙实战-库的调用(ArkTS)

整体框架搭建 主页面、本地库组件页面、社区库组件页面三个页面组成&#xff0c;主页面由Navigation作为根组件实现全局标题&#xff0c;由Tabs组件实现本地库和社区库页面的切换。 // MainPage.ets import { Outer } from ../view/OuterComponent; import { Inner } from ..…

【微服务核心】Spring Boot

Spring Boot 文章目录 Spring Boot1. 简介2. 开发步骤3. 配置文件4. 整合 Spring MVC 功能5. 整合 Druid 和 Mybatis6. 使用声明式事务7. AOP整合配置8. SpringBoot项目打包和运行 1. 简介 SpringBoot&#xff0c;开箱即用&#xff0c;设置合理的默认值&#xff0c;同时也可以…

如何让机器人具备实时、多模态的触觉感知能力?

人类能够直观地感知和理解复杂的触觉信息&#xff0c;是因为分布在指尖皮肤的皮肤感受器同时接收到不同的触觉刺激&#xff0c;并将触觉信号立即传输到大脑。尽管许多研究小组试图模仿人类皮肤的结构和功能&#xff0c;但在一个系统内实现类似人类的触觉感知过程仍然是一个挑战…

【go语言】CSP并发机制与Actor模型

一、多线程共享内存 1. 概念 多线程共享内存模型是一种并发编程模型&#xff0c;其中多个线程在同一个进程的地址空间中共享相同的内存区域。这种模型允许多个线程并发地读取和写入相同的数据结构&#xff0c;但也引入了一些潜在的问题&#xff0c;其中最常见的问题之一就是…

【WordPress插件】热门关键词推荐v1.3.0 Pro开心版

介绍&#xff1a; WordPress插件-WBOLT热门关键词推荐插件&#xff08;Smart Keywords Tool&#xff09;是一款集即时关键词推荐、关键词选词工具及文章智能标签功能于一体的WordPress网站SEO优化插件。 智能推荐&#xff1a; 热门关键词推荐引擎-支持360搜索、Bing、谷歌&a…

【已解决】c++qt如何制作翻译供程序调用

本博文源于笔者正在编写的工具需要创建翻译文件&#xff0c;恰好将qt如何进行翻译&#xff0c;从零到结果进行读者查阅&#xff0c;并非常推荐读者进行收藏点赞&#xff0c;因为步步都很清晰&#xff0c;堪称胎教式c制作&#xff0c;而且内容还包括如何部署在windows下。堪称值…

百分点科技获国际顶会NeurIPS LLM效率挑战赛冠军

近日&#xff0c;国际人工智能顶会NeurIPS在美国新奥尔良市举办&#xff0c;在同期举行的NeurIPS 2023大语言模型效率挑战赛中&#xff0c;百分点科技以领先第二名8分的显著优势夺得NVIDIA A100赛道冠军。 NeurIPS与ICML、ICLR并称机器学习领域国际三大顶会&#xff0c;代表着人…

layui(iconPickerFa)图标选择器插件,主要用于后台菜单图标管理

话不多说直接上代码 在页面中引入如下代码 <link rel"stylesheet" href"/template/admin/layui-v2.5.6/css/layui.css"> <script type"text/javascript" src"/template/admin/layui-v2.5.6/layui.js"></script> &…

SpringCloud 整合 Canal+RabbitMQ+Redis 实现数据监听

1Canal介绍 Canal 指的是阿里巴巴开源的数据同步工具&#xff0c;用于数据库的实时增量数据订阅和消费。它可以针对 MySQL、MariaDB、Percona、阿里云RDS、Gtid模式下的异构数据同步等情况进行实时增量数据同步。 当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.…

CAN协议FPGA篇

一.引言 CAN&#xff08;Controller Area Network&#xff09;总线&#xff0c;即控制器局域网总线&#xff0c;是一种功能丰富的车用总线标准。该协议最初是由德国博世&#xff08;Bosch&#xff09;公司在1983年制定的&#xff0c;之后在美国密歇根州底特律举行的汽车工程师协…