设计模式-注册模式

news2025/4/9 5:28:17
设计模式专栏

    • 模式介绍
    • 模式特点
    • 应用场景
    • 注册模式和单例模式的区别
    • 代码示例
      • 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 defaultdict

class Service(ABC):
    @abstractmethod
    def execute(self):
        pass

class 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.coloradmin.cn/o/1344486.html

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

相关文章

Linux文件的扩展属性 attr cap

文件属性 Linux文件属性分为常规属性与扩展属性&#xff0c;其中扩展属性有两种&#xff1a;attr与xattr. 一般常规的文件属性由stat API 读取&#xff0c;一般是三种权限&#xff0c;ower, group&#xff0c;时间等。 扩展属性attr 用户态API ioctl(fd, FS_IOC32_SETFLAGS…

shiro1.10版本后-IniSecurityManagerFactory过期失效

1、问题概述&#xff1f; 今天在研究了shiro的新版本shiro1.13.0版本&#xff0c;发现用了很长时间的IniSecurityManagerFactory工厂失效了。 从下图中可以看出&#xff0c;在新版本中IniSecurityManagerFactory被打上了过期线了。 那么问题来了&#xff0c;新版本如何使用呢…

数据压缩专题——静止图像的小波变换编码

随着数字图像技术的发展和应用的广泛&#xff0c;对图像的压缩和编码变得越来越重要。小波变换编码作为一种有效的图像压缩和编码方法&#xff0c;在静止图像处理中得到了广泛应用。本文将介绍静止图像的小波变换编码的基本原理和关键步骤&#xff0c;以及其在图像压缩中的应用…

1panel使用指南(一)面板安装

一、1panel简介 1Panel是杭州飞致云信息科技有限公司推出的产品 [1]&#xff0c;帮助用户实现快速建站。 [2]是一款现代化、开源的Linux服务器运维管理面板&#xff0c;于2023年3月推出&#xff0c;深度集成WordPress和Halo&#xff0c;一键完成域名绑定、SSL证书配置等操作&a…

用linux中定时任务Crontab,向企业微信群通过机器人发送消息

1.使用yum命令安装Crontab&#xff1a;这个很关键&#xff0c;没有安装的话会提示命令not found yum install vixie-cron yum install crontabs 注&#xff1a;vixie-cron软件包是cron的主程序&#xff1b; crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表…

Hadoop(2):常见的MapReduce[在Ubuntu中运行!]

1 以词频统计为例子介绍 mapreduce怎么写出来的 弄清楚MapReduce的各个过程&#xff1a; 将文件输入后&#xff0c;返回的<k1,v1>代表的含义是&#xff1a;k1表示偏移量&#xff0c;即v1的第一个字母在文件中的索引&#xff08;从0开始数的&#xff09;&#xff1b;v1表…

C#中使用is关键字检查对象是否与给定类型兼容

目录 一、定义 二、示例 三、生成 在程序的开发过程中经常会使用类型转换&#xff0c;如果类型转换不成功则会出现异常&#xff0c;从抛出异常到捕获并处理异常&#xff0c;无形中增加了系统的开销&#xff0c;而且太过频繁地处理异常还会严重地影响系统的稳定性。is关键字可…

要学习openfoam,c++需要掌握到什么程度?

要学习openfoam&#xff0c;c需要掌握到什么程度&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「c的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&…

JY901S 9轴姿态角度传感器模块

JY901S 9轴姿态角度传感器模块 JY901S 简介模块特性引脚说明IIC通讯IIC读写寄存器代码示例 JY901S 简介 模块集成高精度的陀螺仪、加速度计、地磁场传感器&#xff0c;采用高性能的微处理器和先进的动力学解算与卡尔曼动态滤波算法&#xff0c;能够快速求解出模块当前的实时运…

PHP序列化总结2--常见的魔术方法

魔术方法的概念 PHP的魔术方法是一种特殊的方法&#xff0c;用于覆盖PHP的默认操作。它们以双下划线&#xff08;__&#xff09;开头&#xff0c;后面跟着一些特定的字符串&#xff0c;如__construct()、__destruct()、__get()等。这些魔术方法在对象执行特定操作时被自动调用…

OpenCV-Python(22):直方图的计算绘制与分析

目标 了解直方图的原理及应用使用OpenCV 或Numpy 函数计算直方图使用Opencv 或者Matplotlib 函数绘制直方图学习函数cv2.calcHist()、np.histogram()等 原理及应用 直方图是一种统计图形&#xff0c;是对图像的另一种解释&#xff0c;用于表示图像中各个像素值的频次分布。直…

【Linux Shell学习笔记】Linux Shell的位置参数与函数

一、位置参数 位置参数&#xff0c;也被称之为位置变量&#xff0c;通过位置参数&#xff0c;可以在执行程序的时候&#xff0c;向程序传递数据 1.1 shell接收参数的方法 1.2 向shell传递参数的方法 二、函数 2.1 函数基础 2.1.1 函数简介 函数本质上就是一个代码块&#xf…

【并行计算】GPU,CUDA

一、CUDA层次结构 1.kernel核函数 一个CUDA程序是一个kernel核函数被GPU的多个计算单元并行执行的过程&#xff0c;CUDA给了如下抽象 dim3 threadsPerBlock(4, 3, 1); dim3 numBlocks(3, 2, 1); matrixAdd<<<numBlocks, threadsPerBlock>>>(A, B, C); 2.G…

人工智能的第一性原理

今天跟大家分享一篇 北师大 - 图像处理研究中心主任 郭平教授的一篇文章 通过“四个问题”&#xff0c; 解释了人工智能的第一性原理 提出了如何运用第一性原理思维 来解决人工智能缺乏基本常识的问题 并且他建议将最小作用量原理 作为人工智能的第一性原理 什么是第一…

JavaScript系列——正则表达式

文章目录 需求场景正则表达式的定义创建正则表达式通过 / 表示式/ 创建通过构造函数创建 编写一个正则表达式的模式使用简单模式使用特殊字符常用特殊字符列表特殊字符组和范围 正则表达式使用代码演示 常用示例验证手机号码合法性 小结 需求场景 在前端开发领域&#xff0c;在…

Java注解学习,一文掌握@Autowired 和 @Resource 注解区别

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

【AI导师】利用Coding Agent完成AIGC编程

利用Coding Agent完成AIGC编程 一、前言二、Coding Agent三、1024code四、AI导师README项目初版功能定义代码结构设计方案函数方法设计方案迭代记录 一、前言 AI产品的发展确实在过去两年年中取得了显著进展&#xff0c;尤其是在编程领域。一开始&#xff0c;ChatGPT和类似的语…

Android 13 默认关闭 快速打开相机

介绍 在设置菜单的手势界面里&#xff0c;快速打开相机是默认开启的&#xff0c;此功能当开启时连续点击两次电源键会打开相机&#xff0c;现在客户需要默认关闭。 效果展示 修改 这里一开始想到的就是配置文件&#xff0c;在路径下果然找到了,从注释中看使我们需要的&#x…

纯CSS3制作优惠券线性UI效果

纯CSS3制作优惠券线性UI效果-遇见你与你分享

MIT线性代数笔记-第33讲-复习三

目录 33.复习三打赏 33.复习三 已知 d u ⃗ d t A u ⃗ [ 0 − 1 0 1 0 − 1 0 1 0 ] u ⃗ \dfrac{d \vec{u}}{dt} A \vec{u} \begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & -1 \\ 0 & 1 & 0 \end{bmatrix} \vec{u} dtdu ​Au ​010​−101​0−10​ ​…