所谓“多例模式”并不在GoF的23种设计模式之内,是单例模式中的一种特例,在很多资料中也被称为单例模式的容器式实现。“多例模式”可以理解为在一定数量范围内创建类的多个实例(简称“说法一”);还有一层理解就是不同类型的对象可以创建多个,但相同类型的对象只能创建一个(简称“说法二”)。
说法一
先看代码:
public class Multition {
private Multition() {}
private static final int COUNT = 5;
private static Map<String,Object> ioc = new ConcurrentHashMap<String,Object>();
static {
for (int i = 0; i < COUNT; i++) {
ioc.put(""+i,new Multition());
}
}
public static Object getInstance(String name){
synchronized (ioc){
return ioc.get(name);
}
}
}
这种写法提供了一种灵活、可控制实例数量的解决方案。我们可以通过合理使用多例模式避免资源的浪费,提高系统的性能和可扩展性。但是需要注意,多例模式的设计需要根据具体情况进行调整,确保在不同场景下创建适当数量的实例。
说法二
先看代码:
public class Multition {
private Multition() {}
private static Map<String,Object> ioc = new ConcurrentHashMap<String,Object>();
public static Object getInstance(String className){
synchronized (ioc){
if (!ioc.containsKey(className)){
Object obj = null;
try{
obj = Class.forName(className).getNestHost();
ioc.put(className,obj);
}catch (Exception e){
e.printStackTrace();
}
return obj;
}
return ioc.get(className);
}
}
}
这种写法适用于需要大量创建单例对象的场景,便于管理,但因为用到了反射,所以对性能有一定的影响。