您的位置:首页 > 编程语言 > Java开发

java之-------设计模式(多例模式)

2015-09-12 20:01 295 查看
★ 为什么要学习设计模式

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对象时候,我们需要属于同一个对象时候,我们可以采用这种设计模式,多例也就是单例的扩展,仔细看也差不多的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: