设计模式之多例模式
介绍
多例模式和单例模式有异曲同工之妙,只是单例模式的思想是一个类只有一个实体对象。而多例模式是一种池思想,一个类有固定数量的实体对象,当需要使用实体对象的时候从池中获取。
简单来说就是自己创建自己指定数量的实体对象,管理自己的实体对象,并给外界提供获取对象的方法。
适用场景
例如数据库中的连接池,就是运用了池思想,其实现原理可以理解为一个List集合,里面放入了若干连接对象,每当用户获取连接对象的时候,则从list中取出一个连接对象。
代码实现
场景描述
我们可以用代码模拟共享充电宝的现实场景,假设一个充电站存放了10个充电宝。我们每借走一个充电宝,则充电站减少一个充电宝,直到充电站里的充电宝全部被取走。用户再来取的时候告诉用户没有充电宝了。
实现思路:
- 创建一个充电宝的实体类,并且将构造方法私有化,保证无法从外界创建实体类。
- 实体类中创建一个集合容器,在类加载的时候初始化容器。
- 实现一个可以获取容器中对象的方法。并且保证获取后别的用户不会在得到这个对象。
充电宝实体类
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版权协议,转载请附上原文出处链接和本声明。