第54章
大B:“你知不知道單體模式有哪些不同表現形式?”
小A:“我知道。不同表現形式:1、餓漢式單體類:類被加載的時候將自己初始化。更加安全些。2、懶漢式單體類:在第一次被引用的時候將自己初始化。提高了效率。3、多例類(多例模式):除了可以提供多個實例,其他和單體類沒有區別。”
大B:“不錯,我再詳細說給你聽吧!”
單體模式的不同表現形式之:多例類(多例模式)
所謂多例(MultitonPattern)實際上就是單例模式的自然推廣。作為對象的創建模式,多例模式或多例類有以下的特點:
1、多例類可以有多個實例
2、多例類必須自己創建,管理自己的實例,並向外界提供自己的實例。這種允許有限個或無限個實例,並向整個JVM提供自己實例的類叫做多例類,這種模式叫做多例模式。
(1)有上限多例模式。有上限的多例類已經把實例的上限當作邏輯的一部分,並建造到了多例類的內部,這種多例模式叫做有上限多例模式。
importjava.util.Random;
importjava.util.Date;
publicclassDie
{
privatestaticDiedie1=newDie();
privatestaticDiedie2=newDie();
/**
*私有的構造函數保證外界無法直接將此類實例化
*
*/
privateDie()
{
}
/**
*工廠方法
*/
publicstaticDiegetInstance(intwhichOne)
{
if(whichOne……1)
{
returndie1;
}else{
returndie2;
}
}
/**
*投骰子,返回一個在1~6之間的隨機數
*/
publicsynchronizedintdice()
{
Dated=newDate();
Randomr=newRandom(d.getTime());
intvalue=r.nextInt();//獲取隨機數
value=Math.abs(value);//獲取隨機數的絕對值
value=value%6;//對6取模
value+=1;//由於value的範圍是0~5,所以value+1成為1~6
returnvalue;
}
}
/**
*測試的客戶端,投擲骰子
*/
publicclassDieClient
{
privatestaticDiedie1,die2;
publicstaticvoidmain(String[]args)
{
die1=Die.getInstance(1);
die2=Die.getInstance(2);
System.out.println(die1.dice());
System.out.println(die2.dice());
}
}
importjava.util.Random;
importjava.util.Date;
publicclassDie
{
privatestaticDiedie1=newDie();
privatestaticDiedie2=newDie();
/**
*私有的構造函數保證外界無法直接將此類實例化
*
*/
privateDie()
{
}
/**
*工廠方法
*/
publicstaticDiegetInstance(intwhichOne)
{
if(whichOne……1)
{
returndie1;
}else{
returndie2;
}
}
/**
*投骰子,返回一個在1~6之間的隨機數
*/
publicsynchronizedintdice()
{
Dated=newDate();
Randomr=newRandom(d.getTime());
intvalue=r.nextInt();//獲取隨機數
value=Math.abs(value);//獲取隨機數的絕對值
value=value%6;//對6取模
value+=1;//由於value的範圍是0~5,所以value+1成為1~6
returnvalue;
}
}
/**
*測試的客戶端,投擲骰子
*/
publicclassDieClient
{
privatestaticDiedie1,die2;
publicstaticvoidmain(String[]args)
{
die1=Die.getInstance(1);
die2=Die.getInstance(2);
System.out.println(die1.dice());
System.out.println(die2.dice());
}
}
(2)無上限多例模式。例數目沒有上限的多例模式叫無上限多例模式。
注意:由於沒有上限的多例類對實例的數目是沒有限製的,因此,雖然這種多例模式是單例模式的推廣,但是這種多例類並不一定能夠回到單例類。於是先不知道要創建多少個實例,因此,必然使用聚集管理所有的實例。
例子:購物車
importjava.util.ArrayList;
importjava.util.HashMap;
publicclassShoppingCart{
privateShoppingCartshoppingCart=null;
//使觓shMap聚集管理所有的實例;
privatestaticHashMap《String,ShoppingCart》instanse=newHashMap《String,ShoppingCart》();
//訂單列表
privateArrayList《ItemOrder》orderedItems=null;
//更新器
privateintreadCount=0;
/**
*同單例類一樣,私有的構造函數保證外界無法直接將此類實例化
*
*/
privateShoppingCart(){
orderedItems=newArrayList《ItemOrder》();
}
/*
*獲取購物車,一個用戶隻能有一個購物車。有多少用戶就有多少購物車。
**/
publicsynchronizedstaticShoppingCartgetInstance(Stringuser){
ShoppingCartshoppingCart=instanse.get(user);
if(shoppingCart……null){
shoppingCart=newShoppingCart();
instanse.put(user,shoppingCart);
}
returnshoppingCart;
}
/*
*用戶退出登陸的時候,通過外部調用將購物車移除。
**/
publicsynchronizedvoidremoveShoppingCart(Stringkey){
instanse.remove(key);
}
/*
*獲取購物車中訂單列表(orderedItems)
**/
publicArrayList《ItemOrder》getOrderedItems(){
readIn();
readOut();
returnorderedItems;
}
/*
*管理訂單。
*如果是舊訂單則更新其數量。
*如果是新訂單則添加到訂單列表中。
**/
publicvoidaddItem(StringitemId){
updateIn();
ItemOrderorder;
for(inti=0;i