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

本文介绍了多例模式的概念及其应用场景,它是单例模式的一种扩展形式,通过限制实例数量并复用对象来提高系统的效率和资源利用。文章通过两个具体示例展示了多例模式的实现方式,并提供了测试代码验证其正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

★ 为什么要学习设计模式

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对象时候,我们需要属于同一个对象时候,我们可以采用这种设计模式,多例也就是单例的扩展,仔细看也差不多的。

单例模式的扩展及应用。 编写一个类LimitInstanceClass,该类最可以实例化指定个数实例。实例的个数用配置文件InstanceLimit.cfg指定。例如,如果InstanceLimit.cfg的内容为2,则LimitInstanceClass最可以同时存在2个对象。LimitInstanceClass的对象有一个整型成员变量id,保存对象的编号;有一个boolean型变量isBusy,如果该变量的值为true,表示该对象正在被使用,否则该对象空闲;如果存在空闲的对象,则调用LimitInstanceClass的getInstance()方法会返回一个空闲对象,同时将该对象的isBusy置为true;如果不存在空闲对象则返回null。LimitInstanceClass有一个release()方法,该方法将对象的isBusy置为false。LimitInstanceClass还有一个String类型的成员变量accessMessage,以及一个成员方法writeAccessMessage(String message),该方法将参数message追加到accessMessage。LimitInstanceClass的printAccessMessage()方法输出accessMessage的内容。 编写一个线程类AccessLimitInstanceClassThread,在其run()方法中获取一个LimitInstanceClass对象,调用获得的对象的writeAccessMessage(String message)将自己的线程名写入accessMessage,随机休眠0-5秒,再调用printAccessMessage(),最后调用release()方法。 编写一个UseLimitInstanceClass类,在其main方法中实例化10个AccessLimitInstanceClassThread线程对象,并启动各个线程。 设置InstanceLimit.cfg的内容为3,写出你的程序的运行结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值