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

一、什么是多例模式(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.hqwc.cn/news/104023.html

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

相关文章

哈希的应用——布隆过滤器

文章目录 前言1. 布隆过滤器提出2. 布隆过滤器概念3. 布隆过滤器的插入多哈希函数映射减少冲突结构定义及set&#xff08;插入&#xff09;函数实现 4. 布隆过滤器的查找test&#xff08;查找&#xff09;函数实现布隆过滤器允许误判 5. 布隆过滤器的适用场景6. 如何选择布隆过…

linux系统中u-boot命令的EMMC和SD卡操作命令分析

​今天给大家详细的介绍一下u-boot命令之EMMC和SD卡操作的mmc命令使用。希望这篇文章对大家有所帮助。 uboot 支持 EMMC 和 SD 卡&#xff0c;因此也要提供 EMMC 和 SD 卡的操作命令。一般认为 EMMC和 SD 卡是同一个东西&#xff0c;所以没有特殊说明&#xff0c;统一使用 MMC …

windows安装向量数据库milvus

本文介绍windows下安装milvus的方法。 一.Docker安装 1.1docker下载 首先到Docker官网上下载docker:Docker中文网 官网 1.2.安装前前期准备 先使用管理员权限打开windows powershell 然后在powershell里面输入下面那命令&#xff0c;启用“适用于 Linux 的 Windows 子系统”…

Java反序列化漏洞复现(weblogic和s2)

文章目录 weblogic启动环境漏洞扫描漏洞复现 S2-045启动环境漏洞复现 前提条件&#xff1a; 1.安装docker docker pull medicean/vulapps:j_joomla_22.安装docker-compose docker run -d -p 8000:80 medicean/vulapps:j_joomla_23.下载vulhub weblogic 启动环境 到下面路径下…

AP51656 LED车灯电源驱动IC 兼容替代PT4115 PT4205 PWM和线性调光

产品描述 AP51656是一款连续电感电流导通模式的降压恒流源 用于驱动一颗或多颗串联LED 输入电压范围从 5V 到 60V&#xff0c;输出电流 可达 1.5A 。根据不同的输入电压和 外部器件&#xff0c; 可以驱动高达数十瓦的 LED。 内置功率开关&#xff0c;采用高端电流采样设置 …

第64步 深度学习图像识别:多分类建模误判病例分析(Pytorch)

基于WIN10的64位系统演示 一、写在前面 上期我们基于TensorFlow环境介绍了多分类建模的误判病例分析。 本期以健康组、肺结核组、COVID-19组、细菌性&#xff08;病毒性&#xff09;肺炎组为数据集&#xff0c;基于Pytorch环境&#xff0c;构建SqueezeNet多分类模型&#xf…

Prometheus+Grafana 搭建应用监控系统

一、背景 完善的监控系统可以提高应用的可用性和可靠性&#xff0c;在提供更优质服务的前提下&#xff0c;降低运维的投入和工作量&#xff0c;为用户带来更多的商业利益和客户体验。下面就带大家彻底搞懂监控系统&#xff0c;使用Prometheus Grafana搭建完整的应用监控系统。 …

Pandas数据中的浅拷贝与深拷贝

pandas库主要有两种数据结构DataFrames和Series。这些数据结构在内部用索引数组和数据数组表示&#xff0c;索引数组标记数据&#xff0c;数据数组包含实际数据。现在&#xff0c;当我们试图复制这些数据结构&#xff08;DataFrames和Series&#xff09;时&#xff0c;我们实际…

【Github】git本地仓库建立与远程连接

文章目录 前言一、git简介二、git下载2.1下载地址 三、git安装3.1安装3.2 配置3.3 config设置&#xff08;增删改查&#xff09; 四.github与git连接——本地Git仓库4.1 建本地的版本库4.2 源代码放入本地仓库4.3提交仓库 五、github与git的连接——远程连接5.1 创建SSH Key5.2…

调用API接口的一些注意技巧

在实践中我们经常发现&#xff0c;很多同学都是直接请求调用和读取接口数据&#xff0c;而没有做状态码的判断&#xff0c;这在设计角度是非常不合理的。 另外&#xff0c;对于一些实时性要求不高的接口&#xff0c;更合理的做法应该是先把数据拉到本地缓存&#xff0c;再从缓存…

openpnp - 底部相机高级矫正后,底部相机看不清吸嘴的解决方法

文章目录 openpnp - 底部相机高级矫正后,底部相机看不清吸嘴的解决方法概述解决思路备注补充 - 新问题 - N1吸嘴到底部相机十字中心的位置差了很多END openpnp - 底部相机高级矫正后,底部相机看不清吸嘴的解决方法 概述 自从用openpnp后, 无论版本(dev/test), 都发现一个大概…

数字图像处理:亮度对比度-几何变换-噪声处理

文章目录 数字图像增强亮度与对比度转换几何变换图像裁剪尺寸变换图像旋转 噪声处理添加噪声处理噪声 数字图像增强 亮度与对比度转换 图像变换可分为以下两种&#xff1a; 点算子&#xff1a;基于像素变换&#xff0c;在这一类图像变换中&#xff0c;仅仅根据输入像素值计算…