所謂的多例模式(Multiton Pattern),實際上就是單例模式的推廣。作爲對象的創建模式,多例模式或多例類有以下的特點:
- 多例類可有多個實例。
- 多例類必須自己創建、管理自己的實例,並向外界提供自己的實例。
按照實例數目是否有上限,多例模式可以分爲有上限多例類和無上限多例類;如同單例類可以分成有狀態的和沒有狀態的兩種一樣,多例類也可以分成有狀態的和沒有狀態的兩種。多例對象的狀態如果是可以在加載後改變的,那麼這種多例對象叫做可變多例對象(Mutable Multiton);如果多例對象的狀態在加載後不可以改變,那麼這種多例對象叫做不變多例對象(Immutable Multiton)。顯然不變多例類的情形較爲簡單,而可變多例類的情形較爲複雜。
package com.javapatterns.multilingual.dice;
import java.util.Random;
import java.util.Date;
public class Die {
private static Die die1 = new Die();
private static Die die2 = new Die();
private Die() {}
public static Die getInstance(int whichOne) {
if (whichOne == 1) {
return die1;
} else {
return die2;
}
}
public synchronized int dice() {
Date d = new Date();
Random r = new Random(d.getTime());
int value = r.nextInt();
value = Math.abs(value);
value = value % 6;
value += 1;
System.out.println(value);
return value;
}
}
import java.util.Random;
import java.util.Date;
public class Die {
private static Die die1 = new Die();
private static Die die2 = new Die();
private Die() {}
public static Die getInstance(int whichOne) {
if (whichOne == 1) {
return die1;
} else {
return die2;
}
}
public synchronized int dice() {
Date d = new Date();
Random r = new Random(d.getTime());
int value = r.nextInt();
value = Math.abs(value);
value = value % 6;
value += 1;
System.out.println(value);
return value;
}
}
package com.javapatterns.multilingual.dice;
public class Client {
private static Die die1;
private static Die die2;
public static void main(String[] args) {
die1 = Die.getInstance(1);
die2 = Die.getInstance(2);
die1.dice();
die2.dice();
}
}
public class Client {
private static Die die1;
private static Die die2;
public static void main(String[] args) {
die1 = Die.getInstance(1);
die2 = Die.getInstance(2);
die1.dice();
die2.dice();
}
}