疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java设计模式之多例模式


 

 
★ 为什么要学习设计模式
1、设计模式都是一些相对优秀的解决方案,很多问题都是典型的、有代表性的问题,学习设计模式,我们就不用自己从头来解决这些问题,相当于在巨人的肩膀上,复用这些方案即可。
 
2、设计模式已经成为专业人士的常用词汇,不懂不利于交流。
 
3、能让你设计的系统更加专业,让系统有更好的架构。
之前已经介绍过单例模式(饿汉式和懒汉式)点击打开链接
这是单例模式的变形,多例模式;
把上面缓存的单例实现,做成一个能够控制对象个数的共享空间,供整个应用程序使用。在缓存中维护指定个数的对象,每个对象的key值由该类内部指定,有外部请求时直接返回其中一个对象出去。
 
说明:相当于维护一个指定数量的对象池,当请求个数超过控制的总数时,开始循环重复使用 。
用了两个列子来解释:
就是在一个静态池中,同一个对象只有一个内存地址,第一,当传进去的int值一样时,结果是一样的。
[java] 
package cn.hncu.designl.mutity;  
  
import java.util.HashMap;  
import java.util.Map;  
  
public class RuleNum {  
    //先建一个静态的集合(缓冲区),后面放对象  
    private static Map<Integer, RuleNum> hash =new HashMap<Integer, RuleNum>();  
    private RuleNum(){  
    }//空的构造函数  
    public static RuleNum getinstance(Integer key){//  
        RuleNum num=hash.get(key);  
        if(num==null){  
            num=new RuleNum();//对象为空,创建一个新的对象  
            hash.put(key, num);//把创建的对象放进缓冲区  
        }  
        return num;//返回这个对象  
    }  
          
}  
 
这个和之前 的那个相比较,没有传参,但是以count为周期(自己设置的),当超过之后,就会一样
[java] 
package cn.hncu.designl.mutity;  
  
import java.util.HashMap;  
import java.util.Map;  
  
public class B {  
    private static Map<Integer, B> map=new HashMap<Integer, B>();  
    private B(){}  
     static int count=4;  
    static int num=0;  
    public static B getinstance(){//可以通过类名直接访问  
        B b=map.get(num);//从第一个开始  
        if(b==null){  
            b=new B();//若为空,new对象  
            map.put(num, b);  
        }  
        num++;//加1  
    while(num>count){  
        num=0;//从第一个开始循换,吵过之后就直接从1开始  
    }  
        return b;  
    }  
}  
 
下面是测试程序:(运行结果说的很清楚)
[java] 
package cn.hncu.designl.mutity;  
  
public class test {  
  
    public static void main(String[] args) {///验证第不限对象且具有相同的key的内存地址是
 
不是一样的  
        RuleNum rr1 =RuleNum.getinstance(2);  
        RuleNum rr2 =RuleNum.getinstance(3);  
        RuleNum rr3 =RuleNum.getinstance(4);  
        RuleNum rr4 =RuleNum.getinstance(2);  
        System.out.println(rr1);  
        System.out.println(rr2);  
        System.out.println(rr3);  
        System.out.println(rr4);  
        System.out.println("------------------------------");  
        //cn.hncu.designl.mutity.RuleNum@417470d0  
//      cn.hncu.designl.mutity.RuleNum@439a8942  
//      cn.hncu.designl.mutity.RuleNum@56a96eba  
//      cn.hncu.designl.mutity.RuleNum@417470d0  
        //当第一和第四的key值内存地址是一样,说明多例成功了  
          
          
          
        //在B中是4个循环,4个一变化,所以说 b1 b4的内存地址是一样的  
        B b1=B.getinstance();  
        B b2=B.getinstance();  
        B b3=B.getinstance();  
        B b4=B.getinstance();  
        B b5=B.getinstance();  
        B b6=B.getinstance();  
        System.out.println(b1);  
        System.out.println(b2);  
        System.out.println(b3);  
        System.out.println(b4);  
        System.out.println(b5);  
        System.out.println(b6);  
  
//      cn.hncu.designl.mutity.B@5406f513    内存地址  
//      cn.hncu.designl.mutity.B@14c3dd7e  
//      cn.hncu.designl.mutity.B@470285d8  
//      cn.hncu.designl.mutity.B@76a14c53  
//      cn.hncu.designl.mutity.B@579a19fd  
//      cn.hncu.designl.mutity.B@5406f513  内存地址  
    }  
  
}  
 
所以在我们new对象时候,我们需要属于同一个对象时候,我们可以采用这种设计模式,多例也就是单
 
例的扩展,仔细看也差不多的。