JAVA_24设计模式之多例模式

设计模式之多例模式

介绍

多例模式和单例模式有异曲同工之妙,只是单例模式的思想是一个类只有一个实体对象。而多例模式是一种池思想,一个类有固定数量的实体对象,当需要使用实体对象的时候从池中获取。
简单来说就是自己创建自己指定数量的实体对象,管理自己的实体对象,并给外界提供获取对象的方法。

适用场景

例如数据库中的连接池,就是运用了池思想,其实现原理可以理解为一个List集合,里面放入了若干连接对象,每当用户获取连接对象的时候,则从list中取出一个连接对象。

代码实现

场景描述

我们可以用代码模拟共享充电宝的现实场景,假设一个充电站存放了10个充电宝。我们每借走一个充电宝,则充电站减少一个充电宝,直到充电站里的充电宝全部被取走。用户再来取的时候告诉用户没有充电宝了。

实现思路:

  1. 创建一个充电宝的实体类,并且将构造方法私有化,保证无法从外界创建实体类。
  2. 实体类中创建一个集合容器,在类加载的时候初始化容器。
  3. 实现一个可以获取容器中对象的方法。并且保证获取后别的用户不会在得到这个对象。

充电宝实体类

package com.dyh.pojo;

import java.util.HashMap;
import java.util.Map;

/**
 * 充电宝实体类
 */
public class PortableBattery {

    private static Map<Integer, PortableBattery> portableBatteryMap = new HashMap<>();  //存放充电宝的充电站
    private static final int MAX_NUM = 10;       //充电站最多存放10个充电宝

//    类加载的时候初始化充电站
    static {
        for (int i = 1; i <= MAX_NUM; i++) {
            portableBatteryMap.put(i, new PortableBattery());
        }
    }

//    私有化无参构造,防止外界直接创建对象
    private PortableBattery() {
    }

    /**
     * 从充电站获取充电宝
     *
     * @return 充电宝
     */
    public static PortableBattery getPortableBattery() {
//        遍历充电站所有充电宝,如果有充电宝则取出充电宝返回,并从map中删除,模拟被拿走。
        for (int i = 1; i <= MAX_NUM; i++) {
//            如果取出不为空,则从map中取出
            if (portableBatteryMap.get(i) != null) {
                PortableBattery portableBattery = portableBatteryMap.get(i);
                portableBatteryMap.remove(i);
                return portableBattery;
            }
        }
//        如果充电站没有充电宝了,则返回null
        return null;
    }

}

测试方法

package com.dyh;

import com.dyh.pojo.PortableBattery;

public class testDemo {
    public static void main(String[] args) {

//        获取充电站的所有充电宝
        for (int i = 1; i <= 11; i++) {
            System.out.println(PortableBattery.getPortableBattery());
        }

    }
}

运行截图
在这里插入图片描述

优缺点总结

  • 优点:省去了频繁创建销毁对象,在类初始化的时候就可以加载,使用的时候可以直接获取。方便管理和控制对象数量,不存在线程安全问题。
  • 缺点:多个实例,造成内存占用多。

版权声明:本文为weixin_43762091原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。