★ 为什么要学习设计模式
1、设计模式都是一些相对优秀的解决方案,很多问题都是典型的、有代表性的问题,学习设计模式,我们就不用自己从头来解决这些问题,相当于在巨人的肩膀上,复用这些方案即可。
2、设计模式已经成为专业人士的常用词汇,不懂不利于交流。
3、能让你设计的系统更加专业,让系统有更好的架构。
之前已经介绍过单例模式(饿汉式和懒汉式)点击打开链接
这是单例模式的变形,多例模式;
把上面缓存的单例实现,做成一个能够控制对象个数的共享空间,供整个应用程序使用。在缓存中维护指定个数的对象,每个对象的key值由该类内部指定,有外部请求时直接返回其中一个对象出去。
说明:相当于维护一个指定数量的对象池,当请求个数超过控制的总数时,开始循环重复使用 。
用了两个列子来解释:
就是在一个静态池中,同一个对象只有一个内存地址,第一,当传进去的int值一样时,结果是一样的。
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为周期(自己设置的),当超过之后,就会一样
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; } }下面是测试程序:(运行结果说的很清楚)
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对象时候,我们需要属于同一个对象时候,我们可以采用这种设计模式,多例也就是单例的扩展,仔细看也差不多的。