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


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

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

    多例模式的特点是:

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

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

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

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

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

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

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

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

    三、多例模式的几种类型

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

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

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

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

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

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

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

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

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

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

    五、多例模式的代码样例

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

    #include   
    #include   
      
    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;  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

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

    在这里插入图片描述

  • 相关阅读:
    CLIPBERT(2021 CVPR)
    rabbitmq 之 无法自动创建队列的问题
    pywinauto如何连接已经打开的应用程序
    MBTI是什么意思
    永久删除的文件如何恢复?只需4个步骤
    云原生Spark UI Service在腾讯云云原生数据湖产品DLC的实践
    创建数据库报错--MySQL server is running with the --super-read-only option
    element plus封装el-select添加后缀图标并添加远程搜索和对话框功能
    spring探秘之ConfigurationClassPostProcessor(一):处理@ComponentScan注解
    BOM与DOM--记录
  • 原文地址:https://blog.csdn.net/qq_38177302/article/details/132628175