设计模式-10--多例模式(Multition pattern)

news2024/11/18 7:29:06

一、什么是多例模式(Multition pattern)

多例模式(Multition pattern)是单例模式的一种扩展,它属于对象创建类型的设计模式。在多例模式中,一个类可以有多个实例,并且这些实例都是该类本身。因此,这样的类也被称为多例类。

多例模式的特点是:

  1. 多例类可以有多个实例。这意味着你可以根据需求实例化指定数量的对象。
  2. 多例类必须能够自我创建并管理自己的实例池。这意味着在查找对象时,如果找不到,则会创建一个新的对象。
  3. 多例模式实际上就是限制了对象的数量,并且有可能对对象进行重复使用。

多例模式在某些情况下可以替代单例模式,特别是在需要创建多个实例且每个实例的生命周期独立的情况下。多例模式通常用于设计复杂的系统,例如数据库连接、网络通信等。

二、多例模式的现实应用场景

数据库连接是一种常见的需要使用多例模式的应用场景。

在数据库应用中,通常需要为每个客户端请求创建一个数据库连接。然而,创建新的数据库连接是一项开销较大的操作,而且如果每个请求都创建新的连接,会很快耗尽系统的资源。因此,我们通常会使用多例模式来管理数据库连接。

在这种场景下,我们创建一个数据库连接池,该连接池可以预先创建一定数量的数据库连接,并保存在连接池中。当有新的请求需要连接数据库时,系统会先从连接池中获取一个空闲的连接,如果连接池中没有空闲的连接,则等待一段时间或者创建新的连接。当请求结束后,该连接会被放回连接池中,以供其他请求使用。

通过这种方式,我们可以重复利用已有的连接,避免频繁创建和销毁连接,提高了系统的性能和稳定性。同时,连接池的大小也可以根据实际需要进行调整,以满足系统的需求。

这种应用场景符合多例模式的特点,即需要创建多个实例,并且每个实例的生命周期是独立的。通过多例模式,我们可以更好地管理这些实例,并提高系统的效率和性能。

三、多例模式的几种类型

多例模式可以分为两种情况:有上限多例模式和无上限多例模式。

有上限多例模式的特点是:

  1. 多例类可以有多个实例。
  2. 多例类必须自己创建自己的实例,并管理自己的实例,和向外界提供自己的实例。

无上限多例模式的特点是:

  1. 多例类可以有多个实例。
  2. 多例类可以由其他的类创建实例,然后返回。

总之,多例模式是一种创建对象的设计模式,它允许在程序中创建多个对象,并且可以通过某种方式限制对象数量或者允许无限制创建对象。

四、单例模式和多例模式的区别和联系

单例模式和多例模式都是设计模式,但它们之间存在一些关键区别:

  1. 对象创建方式:单例模式:确保只有一个对象被创建,该对象通常被存储在一个静态变量中,并在第一次被需要时创建。多例模式:会创建多个对象,每个请求都会创建一个新的对象,通常通过工厂方法或者构造函数来创建对象。
  2. 对象实例化策略:单例模式:只有一个实例,要么全局访问,要么通过单例类访问。多例模式:对于每个请求都创建一个新的对象,所以每个请求都有自己的对象实例。
  3. 设计目的和原则:单例模式:主要是为了解决实例化问题,避免频繁创建和销毁对象,减少系统开销,主要用于那些只需要一个对象的场景。多例模式:主要解决的是并发问题,即当一个请求改变了对象状态,同时其他请求也在处理这个对象时,会出现问题。

总结来说,单例模式主要是为了节省资源,而多例模式主要是为了解决并发问题。在实际应用中,应根据具体情况选择合适的模式。

五、多例模式的代码样例

以下是一个简单的C++代码示例,演示了多例模式:

#include <iostream>  
#include <list>  
  
class Multiton {  
public:  
    static Multiton* getInstance(int id) {  
        std::list<Multiton*>::iterator it = instances.begin();  
        for (; it != instances.end(); ++it) {  
            if ((*it)->id == id) {  
                return *it;  
            }  
        }  
        // 如果未找到具有指定id的实例,则创建新的实例并返回其指针  
        Multiton* newInstance = new Multiton(id);  
        instances.push_back(newInstance);  
        return newInstance;  
    }  
  
    void doSomething() {  
        std::cout << "Multiton doing something" << std::endl;  
    }  
  
private:  
    static std::list<Multiton*> instances;  
    int id;  
    Multiton(int id) : id(id) {}  
    ~Multiton() {}  
};  
  
std::list<Multiton*> Multiton::instances = std::list<Multiton*>();  
  
int main() {  
    Multiton* m1 = Multiton::getInstance(1);  
    Multiton* m2 = Multiton::getInstance(2);  
    Multiton* m3 = Multiton::getInstance(3);  
  
    m1->doSomething();  
    m2->doSomething();  
    m3->doSomething();  
  
    std::cout << "m1 address: " << m1 << std::endl;  
    std::cout << "m2 address: " << m2 << std::endl;  
    std::cout << "m3 address: " << m3 << std::endl;  
  
    return 0;  
}

在Multiton类中,定义了一个静态成员函数getInstance(int id),该函数用于获取具有指定id的Multiton实例的指针。该函数首先遍历instances列表,查找具有指定id的Multiton实例。如果找到了具有指定id的Multiton实例,则返回该实例的指针。如果没有找到,则说明没有创建具有指定id的Multiton实例,通过new运算符创建了一个新的Multiton实例,并将其指针添加到instances列表中,然后返回该实例的指针。

在Multiton类中,还定义了一个成员函数doSomething(),该函数用于执行一些操作。在main函数中,我们创建了三个Multiton实例m1、m2和m3,并通过调用doSomething()函数来执行一些操作。最后,我们打印了这三个实例的地址。

六、使用多例模式需要注意的问题

使用多例模式需要注意以下几个问题:

  1. 实例数量的限制:多例模式限制了对象的数量,有可能对对象进行重复使用。因此,必须确保限制对象的数量,以避免过多对象造成资源浪费和系统性能下降。
  2. 线程安全问题:多例模式下的对象可能有多个线程同时访问,需要考虑线程安全问题。如果对象包含可变的共享数据,需要采取适当的同步措施来保证线程安全。
  3. 依赖管理:多例模式可能会导致对象之间的依赖关系变得复杂。需要仔细管理对象的依赖关系,以避免出现循环依赖或其他问题。
  4. 资源管理:多例模式可能会导致资源浪费,特别是当对象不再需要时。需要合理管理资源,及时释放不再使用的对象所占用的资源。
  5. 构造函数的安全性:多例模式下的构造函数需要确保安全性,特别是在涉及多个对象之间的依赖关系时。需要仔细设计构造函数,避免出现初始化错误或依赖关系问题。
  6. 单例模式的对比:单例模式和多例模式都是创建对象的设计模式,但它们的应用场景和特点有所不同。需要根据具体需求选择合适的模式,并进行相应的设计和管理。

在这里插入图片描述

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

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

相关文章

实现不同局域网间的文件共享和端口映射,使用Python自带的HTTP服务

文章目录 1. 前言2. 本地文件服务器搭建2.1 python的安装和设置2.2 cpolar的安装和注册 3. 本地文件服务器的发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 数据共享作为和连接作为互联网的基础应用&#xff0c;不仅在商业和办公场景有广泛的应用…

设计模式-5--适配器模式(Adapter Pattern)

一、什么是适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端所期望的另一个接口。适配器模式主要用于解决不兼容接口之间的问题&#xff0c;使得原本…

Windows安装jdk

Windows安装jdk 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.准备安装包&#xff08;需要的滴滴我&#xff09; 2.安装 我是在d盘创建jdk目录&#xff0c;把jdk包解压到jdk里 计算机右键---属性---高级系统设置—环境变量 &#xff08;系统变量里&#xff09;--新…

小兔鲜儿 - 地址模块

目录 小兔鲜儿 - 地址模块 准备工作​ 静态结构​ 地址管理页​ 地址表单页​ 动态设置标题​ 新建地址页​ 接口封装​ 参考代码​ 地址管理页​ 接口调用​ 参考代码​ 修改地址页​ 数据回显​ 更新地址​ 表单校验​ 操作步骤​ 删除地址​ 侧滑组件用法…

Leetcode 剑指 Offer II 042. 最近的请求次数

题目难度: 简单 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 写一个 RecentCounter 类来计算特定时间范围内最近的请求。 请实…

4.2 实现基于栈的表达式求值计算器(难度4/10)

本作业主要考察&#xff1a;解释器模式的实现思想/栈结构在表达式求值方面的绝对优势 C数据结构与算法夯实基础作业列表 通过栈的应用&#xff0c;理解特定领域设计的关键作用&#xff0c;给大家眼前一亮的感觉。深刻理解计算机语言和人类语言完美结合的杰作。是作业中的上等…

钉钉机器人消息推送composer拓展 laravel-dingbot

钉钉机器人消息发送 介绍 企业内部有较多系统支撑着公司的核心业务流程&#xff0c;譬如CRM系统、交易系统、监控报警系统等等。通过钉钉的自定义机器人&#xff0c;可以将这些系统事件同步到钉钉的聊天群。 laravel-dingbot 是一款钉钉机器人消息推送的Laravel扩展&#xff…

vscode c语言代码自动格式化

1、在vscode扩展商店里面搜索Clang-format&#xff0c;安装第1个插件 2、快捷键Ctrl逗号&#xff0c;输入format&#xff0c;选择Clang-Format configuration进行配置&#xff08;其实默认就可以&#xff09; 3、vscode打开文件夹的源码&#xff0c;在该文件夹里面新建一个文件…

[前端必看,后端福利❤]如何创建美观的邮件模板并通过qq邮箱的SMTP服务向用户发送

最近在写注册功能的自动发送邮箱告知验证码的功能&#xff0c;无奈根本没有学过前端&#xff0c;只有写Qt的qss基础&#xff0c;只好借助网页设计自己想要的邮箱格式&#xff0c;最终效果如下: 也推销一下自己的项目ShaderLab&#xff0c;可运行ShaderToy上的大部分着色器代码&…

js只保留数组对象的某个属性,合并公共类型的数据,选择树形结构的数据,并保留每个节点的name

嗨&#xff0c;今天周二了哎&#xff01; 期待周五 文章目录 一、js只保留数组对象的某个属性二、合并公共类型的数据二、选择树形结构的数据&#xff0c;并保留每个节点的name 一、js只保留数组对象的某个属性 let data [{ id: 1, name: 哈哈 }, { id: 2, name: 嘻嘻 }]let n…

ModaHub魔搭社区——大模型能力落地和核心就是应用场景

从今年3月百度率先发布语言大模型生成式AI产品“文心一言”后,各大科技互联网巨头纷纷入局,国内大模型瞬间遍地开花。包括阿里、华为、商汤科技、科大讯飞、360、腾讯等,纷纷推出各类大模型。 人工智能正在进入大规模落地应用关键期。 在IDC近日发布的《中国人工智能公有云…

本地虚机Jumpserver使用域名访问报错 使用IP+端口没有错误

背景&#xff1a; 我在本地Windows VMware 15的环境中部署了CentOS7.5&#xff0c;下载jumpserver-offline-installer-v2.28.1-amd64-138.tar.gz并安装部署。 需求&#xff1a; 1、能使用http:ip访问堡垒机。达成&#xff1b; 2、能使用http:域名访问堡垒机。达成&#xff…

FPGA时序分析与约束(2)——时序电路时序

一、前言 在之前的内容中&#xff0c;我们介绍了组合电路的时序问题和可能导致的毛刺&#xff0c;强烈推荐在阅读前文的基础上再继续阅读本文&#xff0c; 前文链接&#xff1a;FPGA时序分析与约束&#xff08;1&#xff09;——组合电路时序 这篇文章中&#xff0c;我们将继续…

Android安卓webview,网页端生成安卓项目(极速生成)教程

Android安卓webview&#xff0c;网页端生成安卓项目&#xff08;极速生成&#xff09;教程 一&#xff0c;前言 当自己做了一个PC端的页面&#xff0c;也就是前端的页面&#xff0c;或者已经上服的页面&#xff0c;但也想生成一个安卓端供用户使用&#xff0c;本教程详细讲解…

九种情况,要知道灵活变通

九种情况&#xff0c;要知道灵活变通 【安志强趣讲《孙子兵法》第27讲】 第八篇&#xff1a;九变 【全篇大白话】 战场千变万化&#xff0c;胜败看实力&#xff0c;还要看将帅的应变能力。 【原文】 孙子曰&#xff1a;凡用兵之法&#xff0c;将受命于君&#xff0c;合军聚众&a…

解决计算机视觉模型中的种族和性别偏见问题,Meta开源 FACET工具

Meta 公司最新推出的 FACET 工具是为了解决计算机视觉模型中存在的种族和性别偏见问题。该工具经过三万张图片的训练&#xff0c;并含有五万人的图像&#xff0c;特别强调了性别和肤色方面的感知能力。 通过评估计算机视觉模型在不同特征上的表现&#xff0c;FACET 工具可以回答…

vscode远程调试php

使用vscode远程调试php的方法 1.安装remote ssh插件 2.连接服务器 可以点击左下角的绿色按钮&#xff0c;或者ctrlshiftp打开命令框输入remote ssh应该也有。 3.在服务器端vscode安装php debug插件 4.安装xdebug xdebug是用来调试php的软件&#xff0c;原本和vscode没什么关…

无涯教程-JavaScript - GAMMADIST函数

GAMMADIST函数取代了Excel 2010中的GAMMA.DIST函数。 描述 该函数返回伽马分布。您可以使用此功能来研究可能具有偏斜分布的变量。伽马分布通常用于排队分析。 语法 GAMMADIST(x,alpha,beta,cumulative)争论 Argument描述Required/OptionalXThe value at which you want t…

Ubuntu18.04安装docker-io

1. 安装docker 1.1 网上一搜&#xff0c;全是更新仓库、下载依赖、添加docker的gpg密钥、添加docker仓库、安装docker-ce的步骤&#xff0c;但是在安装docker-ce时却提示“package "docker-ce" has no installation candidate”&#xff0c;就很迷。 1.2 安装docke…

设计模式-建造者(生成器)模式

文章目录 简介建造者模式的核心概念产品&#xff08;Product&#xff09;建造者&#xff08;Builder&#xff09;指挥者&#xff08;Director&#xff09;建造者模式与其他设计模式的关系工厂模式和建造者模式uml对比 建造者模式的实现步骤建造者模式的应用场景spring中应用 建…