设计模式-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. 单例模式的对比:单例模式和多例模式都是创建对象的设计模式,但它们的应用场景和特点有所不同。需要根据具体需求选择合适的模式,并进行相应的设计和管理。

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第  1  章  策略模式【STRATEGY PATTERN】 4 第  2  章  代理模式【PROXY PATTERN】 8 第  3  章  单例模式【SINGLETON PATTERN】 12 第  4  章  多例模式MULTITION PATTERN】 16 第  5  章  工厂方法模式【FACTORY METHOD PATTERN】 19 第  6  章  抽象工厂模式【ABSTRACT FACTORY PATTERN】 31 第  7  章  门面模式【FACADE PATTERN】 44 第  8  章  适配器模式【ADAPTER PATTERN】 51 第  9  章  模板方法模式【TEMPLATE METHOD PATTERN】 63 第  10  章  建造者模式【BUILDER PATTERN】 82 第  11  章  桥梁模式【BRIDGE PATTERN】 97 第  12  章  命令模式【COMMAND PATTERN】 112 第  13  章  装饰模式【DECORATOR PATTERN】 126 第  14  章  迭代器模式【ITERATOR PATTERN】 137 第  15  章  组合模式【COMPOSITE PATTERN】 147 第  16  章  观察者模式【OBSERVER PATTERN】 175 第  17  章  责任链模式【CHAIN OF RESPONSIBILITY PATTERN】 194 第  18  章  访问者模式【VISITOR PATTERN】 210 第  19  章  状态模式【STATE PATTERN】 236 第  20  章  原型模式【PROTOTYPE PATTERN】 255 第  21  章  中介者模式【MEDIATOR PATTERN】 268 第  22  章  解释器模式【INTERPRETER PATTERN】 286 第  23  章  亨元模式【FLYWEIGHT PATTERN】 287 第  24  章  备忘录模式【MEMENTO PATTERN】 288 第  25  章  模式大PK 289 第  26  章  六大设计原则 290 26.1 单一职责原则【SINGLE RESPONSIBILITY PRINCIPLE】 290 26.2 里氏替换原则【LISKOV SUBSTITUTION PRINCIPLE】 297 26.3 依赖倒置原则【DEPENDENCE INVERSION PRINCIPLE】 309 26.4 接口隔离原则【INTERFACE SEGREGATION PRINCIPLE】 310 26.5 迪米特法则【LOW OF DEMETER】 320 26.6 开闭原则【OPEN CLOSE PRINCIPLE】 330 第  27  章  混编模式讲解 332 第  28  章  更新记录: 334 相关说明 335 相关说明 335 第  29  章  后序 336
Java设计模式 策略模式【STRATEGY PATTERN】 .................................................................................................. 4 第 2 章 代理模式【PROXY PATTERN】 ....................................................................................................... 8 第 3 章 单例模式【SINGLETON PATTERN】 ...............................................................................................12 第 4 章 多例模式MULTITION PATTERN】 ...............................................................................................16 第 5 章 工厂方法模式【FACTORY METHOD PATTERN】 ............................................................................19 第 6 章 抽象工厂模式【ABSTRACT FACTORY PATTERN】 ..........................................................................31 第 7 章 门面模式【FACADE PATTERN】 .................................................................................................... 44 第 8 章 适配器模式【ADAPTER PATTERN】 .............................................................................................. 51 第 9 章 模板方法模式【TEMPLATE METHOD PATTERN】 ..........................................................................63 第 10 章 建造者模式【BUILDER PATTERN】 ................................................................................................82 第 11 章 桥梁模式【BRIDGE PATTERN】 ..................................................................................................... 97 第 12 章 命令模式【COMMAND PATTERN】 ............................................................................................. 112 第 13 章 装饰模式【DECORATOR PATTERN】 ............................................................................................ 126 第 14 章 迭代器模式【ITERATOR PATTERN】 ............................................................................................ 137 第 15 章 组合模式【COMPOSITE PATTERN】 ............................................................................................ 147 第 16 章 观察者模式【OBSERVER PATTERN】 ........................................................................................... 175 第 17 章 责任链模式【CHAIN OF RESPONSIBILITY PATTERN】 .................................................................. 194 第 18 章 访问者模式【VISITOR PATTERN】 ............................................................................................... 210 第 19 章 状态模式【STATE PATTERN】 ...................................................................................................... 236 第 20 章 原型模式【PROTOTYPE PATTERN】 ............................................................................................ 255 第 21 章 中介者模式【MEDIATOR PATTERN】 .......................................................................................... 256 第 22 章 解释器模式【INTERPRETER PATTERN】 ...................................................................................... 257 第 23 章 亨元模式【FLYWEIGHT PATTERN】 ............................................................................................. 258 第 24 章 备忘录模式【MEMENTO PATTERN

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值