多例模式

多例模式分两种:
无上限多例模式:与普通类一样,直接用new来实例化,这里不做讨论。
有上限多例模式:把实例的上限当做逻辑的一部分,并建造到多例类的内部。
例如,某公司有3台服务器,公司员工都可以使用这些服务器,比如,小明和小华都需要用server1这台服务器,他们所做的操作显然都是作用于server1(同一个实例)的,所以server1属于单例类,同理server2、server3也属于单例类。当然,我们可以分别为服务器建单例类,但是,服务器所具有的属性、方法都是一样的,分开建类自然很多代码不能复用。采用继承或实现接口的方式又不能保证类的单例性。所以这里引入了多例类:

import java.util.Date;

import java.util.HashMap;

public class MultiClass {

   private int state = 0;

   private String name;

   private static HashMap<MultiClassName.SERVERNAME,MultiClass> multiClassList =

         new HashMap<MultiClassName.SERVERNAME, MultiClass>();

   private MultiClass(String name){

      this.name = name;

   }

   //初始化服务器实例map

   static{

      for(MultiClassName.SERVERNAME name:MultiClassName.SERVERNAME.values()){

         multiClassList.put(name, new MultiClass(name.toString()));

      }

   }

   public static MultiClass getInstance(MultiClassName.SERVERNAME serverName){

      return multiClassList.get(serverName);

   }

   public synchronized void setState(int state){

      this.state = state;

      try {

         Thread.sleep(1500);

      } catch (InterruptedException e) {}

   }

   public synchronized void getState(){

      System.out.println("instanceName:"+name+";state:"+state);

      System.out.println(new Date().getSeconds());

      try {

         Thread.sleep(2500);

      } catch (InterruptedException e) {}

   }

   public static void main(String[]args){

      Thread1 thread1 = new Thread1();

      Thread2 thread2 = new Thread2();

      thread1.start();

      thread2.start();

   }

}

 

public class MultiClassName {

   public static enum SERVERNAME{

      SERVER1,SERVER2,SERVER3

   }

}


public class Thread1 extends Thread{

   @Override

   public void run(){

      while(true){

         MultiClass multiClass = MultiClass.getInstance(MultiClassName.SERVERNAME.SERVER1);

         multiClass.getState();

         try {

            sleep(1000);

         } catch (InterruptedException e) {}

      }

   }

}

 

public class Thread2 extends Thread{

   @Override

   public void run(){

      int state = 0;

      while(true){

         state++;

         MultiClass multiClass = MultiClass.getInstance(MultiClassName.SERVERNAME.SERVER1);

         multiClass.setState(state);

         try {

            sleep(1000);

         } catch (InterruptedException e) {}

      }

   }

}

上面线程只调用了SERVER1这个实例,要想获得哪个类的实例,只需传入相应参数便可,并且获得的类实例是唯一的。





版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://my.oschina.net/u/1987489/blog/491368

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单例模式的扩展及应用。 编写一个类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、付费专栏及课程。

余额充值