java 多例模式:单例模式的推广

来源:互联网 发布:买低价机票软件 编辑:程序博客网 时间:2024/05/18 13:47
多例模式实际上就是单例模式的推广,多例模式又划分为有上限多例模式无上限多例模式两种,有上限多例模式中的多例类的实例是有上限的,
当这个多例类中的上限数值上等于 1 时,此时,多例类退化回到了单例类;而对于无上限多例模式中的多例类,它的上限是没有限制的,也就是说它的上限数值是不确定的,
这个多例类并不一定能够退化成单例类;

单例模式与多例模式一般性结构:


多例模式特点:
     1. 多例类可以有多个实例
     2. 多例类必须自己创建自己的实例,并管理自己的实例,和向外界提供自己的实例


多例类的一个实例,比如:一副麻将都需要有两颗骰子,在没有特别意外发生的情况下,这副麻将打多少圈用的都将是这两颗骰子,两颗骰子代表的是不同的两个状态,
这里可以将骰子设计成多例类,如图:


多例类:Dice.java

package pattern.multion;

import java.util.Random;
/**
 * -----------------------------------------
 * @描述  骰子有上限多例类
 * @作者  fancy
 * @邮箱  fancydeepin@yeah.net
 * @日期  2012-7-31 <p>
 * -----------------------------------------
 
*/

public class Dice {

    
public  static final int  INSTANCE1 = 0;
    
public  static final int  INSTANCE2 = 1;
    
private static final Dice DICE_INSTANCE1 = new Dice(); //饿汉式
    private static final Dice DICE_INSTANCE2 = new Dice(); //饿汉式
    
    
//私有化构造子,阻止外部直接实例化对象
    private Dice(){
        
    }

    
    
/**
     * <B>方法描述:</B>
     * <p style="margin-left:20px;color:#A52A2A;">
     * 获取多例类的实例
     * 
@param which <span style="color: #008080;"> 取值范围:<BR>
     * ① Dice.INSTANCE1:返回Dice的第一个实例对象<BR>
     * ② Dice.INSTANCE2:返回Dice的第二个实例对象<BR>
     * </span>
     * 
@return <span style="color: #008080;"> 返回Dice的一个实例对象 </span>
     
*/

    
public static Dice getInstance(int which){
        
        
switch(which){
            
case INSTANCE1 :
                
return DICE_INSTANCE1;
            
case INSTANCE2 :
                
return DICE_INSTANCE2;
            
default :
                
try {
                    
throw new Exception("找不到与参数 " + which + " 相匹配的实例!");
                }
 catch (Exception e) {e.printStackTrace();}
        }

        
return null;
    }

    
    
/**
     * <B>方法描述:</B>
     * <p style="margin-left:20px;color:#A52A2A;">
     * 此方法是线程安全的,调用该方法来掷骰子
     * 
@return <span style="color: #008080;"> 返回骰子的点数 </span>
     
*/

    
public synchronized int roll(){
        
        
try {
            Random ran 
= new Random(System.currentTimeMillis());
            
int rollValue = ran.nextInt();
            rollValue 
%= 6;
            Thread.sleep(
6);
            
return rollValue > 0 ? ++rollValue : --rollValue * -1;
        }
 catch (Exception e) {e.printStackTrace();}
        
        
return 1;
    }

}



客户端测试类:Mahjong.java

package pattern.multion;
/**
 * -----------------------------------------
 * @描述  客户端测试类
 * @作者  fancy
 * @邮箱  fancydeepin@yeah.net
 * @日期  2012-7-31 <p>
 * -----------------------------------------
 
*/

public class Mahjong {

    
private static Dice dice1 = Dice.getInstance(Dice.INSTANCE1),
                                          dice2 
= Dice.getInstance(Dice.INSTANCE2);
    
    
public static void main(String[] args){

        
int value1 = dice1.roll();
        
int value2 = dice2.roll();
        System.out.println(value1);
        System.out.println(value2);
    }

    
}





  [ 转载请:http://www.blogjava.net/fancydeepin ]
0 0
原创粉丝点击