多例模式

多例模式分两种:
无上限多例模式:与普通类一样,直接用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这个实例,要想获得哪个类的实例,只需传入相应参数便可,并且获得的类实例是唯一的。





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

你可能感兴趣的:(多例模式)