多例设计模式其实就是单例设计模式的变形
缓存在编程中使用很频繁,它能够帮助程序实现以空间换取时间,通常被设计成整个应用程序所共享的一个空间,现要求实现一个用缓存存放单例对象的类(也可以说是一个对象池)。
假设该缓存中可以存放多个该类对象,每个对象以一个key值标识,key值相同时所访问的是同一个单例对象。将其做成一个能够控制对象个数的共享空间,供整个应用程序使用。在缓存中维护指定个数的对象,每个对象的key值由该类内部指定,有外部请求时直接返回其中一个对象出去。
这里假设维护一个指定数量的对象池,当请求个数超过控制的总数时,开始循环重复使用 ,而实际工程上是十分复杂的,例如一个线程来到请求对象的时候,可能刚好对象都用完了,这就需要用户进行等待(线程睡眠,防止入侵),当它所请求的对象被上一个用户释放的时候应该唤醒该线程获取对象。
1.可以new 任意多个对象的池
/**
* 多例设计模式
* 多例设计模式是基于单例设计模式的
* 做成一个能够控制对象个数的共享空间,
* 供整个应用程序使用。在缓存中维护指定个数的对象,
* 每个对象的key值由该类内部指定,有外部请求时直接返回其中一个对象出去
*/
public class MulObj {
//对象池是单例
private static final Map<String, MulObj>pool = new HashMap<String, MulObj>();
private MulObj(){}
public static MulObj getInstance(String key){
if(!pool.containsKey(key)){
pool.put(key, new MulObj());
}
return pool.get(key);
}
}
@Test
public void testMul_1(){
myThread[]mt = new myThread[200];
for (int i = 0; i < mt.length; i++) {
mt[i] = new myThread();
}
for (int i = 0; i < mt.length; i++) {
mt[i].start();
}
}
public class myThread extends Thread{
@Override
public void run() {
System.out.println("bl:"+MulObj.getInstance("bl").hashCode());
//System.out.println("yy:"+MulObj.getInstance("yy").hashCode());
}
}
2.按照上述有限制数量的对象池(简单描述)
public class MulObj2 {
private static final Map<Integer, MulObj2>pool = new HashMap<Integer, MulObj2>();
private static final int MAX = 3;
private static int count = 1;
private MulObj2(){}//这个需要根据工程需求是否能被外部调用
public static MulObj2 getInstance(){
MulObj2 m2 = pool.get(count++);
if(m2==null){
m2 = new MulObj2();
pool.put(count-1, m2);
}
count = count>MAX?1:count;
return m2;
}
}
@Test
public void testMul_2(){
myThread2[]mt = new myThread2[200];
for (int i = 0; i < mt.length; i++) {
mt[i] = new myThread2();
}
for (int i = 0; i < mt.length; i++) {
mt[i].start();
}
}
public class myThread2 extends Thread{
@Override
public void run() {
System.out.println("bl:"+MulObj2.getInstance().hashCode());
}
}