คลาสแบบคงที่ที่มีตัวแปรคงที่เป็นจำนวนมากเป็นเรื่องยาก
/**
* Grotty static semaphore
**/
public static class Ugly {
private static int count;
public synchronized static void increment(){
count++;
}
public synchronized static void decrement(){
count--;
if( count<0 ) {
count=0;
}
}
public synchronized static boolean isClear(){
return count==0;
}
}
ซิงเกิลตันที่มีอินสแตนซ์จริงจะดีกว่า
/**
* Grotty static semaphore
**/
public static class LessUgly {
private static LessUgly instance;
private int count;
private LessUgly(){
}
public static synchronized getInstance(){
if( instance==null){
instance = new LessUgly();
}
return instance;
}
public synchronized void increment(){
count++;
}
public synchronized void decrement(){
count--;
if( count<0 ) {
count=0;
}
}
public synchronized boolean isClear(){
return count==0;
}
}
สถานะอยู่ในอินสแตนซ์เท่านั้น
ดังนั้นจึงสามารถแก้ไขซิงเกิลตันในภายหลังเพื่อทำพูลอินสแตนซ์เธรดโลคัลเป็นต้นและโค้ดที่เขียนไว้แล้วไม่จำเป็นต้องเปลี่ยนแปลงเพื่อให้ได้รับประโยชน์
public static class LessUgly {
private static Hashtable<String,LessUgly> session;
private static FIFO<LessUgly> freePool = new FIFO<LessUgly>();
private static final POOL_SIZE=5;
private int count;
private LessUgly(){
}
public static synchronized getInstance(){
if( session==null){
session = new Hashtable<String,LessUgly>(POOL_SIZE);
for( int i=0; i < POOL_SIZE; i++){
LessUgly instance = new LessUgly();
freePool.add( instance)
}
}
LessUgly instance = session.get( Session.getSessionID());
if( instance == null){
instance = freePool.read();
}
if( instance==null){
// TODO search sessions for expired ones. Return spares to the freePool.
//FIXME took too long to write example in blog editor.
}
return instance;
}
เป็นไปได้ที่จะทำสิ่งที่คล้ายกันกับคลาสแบบคงที่ แต่จะมีค่าใช้จ่ายต่อการโทรในการจัดส่งทางอ้อม
คุณสามารถรับอินสแตนซ์และส่งต่อไปยังฟังก์ชันเป็นอาร์กิวเมนต์ได้ ซึ่งจะช่วยให้รหัสถูกนำไปที่ซิงเกิลตันที่ "ถูกต้อง" เรารู้ว่าคุณต้องการเพียงหนึ่งในนั้น ... จนกว่าคุณจะไม่มี
ประโยชน์ที่ยิ่งใหญ่คือเสื้อกล้ามที่มีสถานะสามารถทำให้เธรดปลอดภัยได้ในขณะที่คลาสแบบคงที่ไม่สามารถทำได้เว้นแต่คุณจะแก้ไขให้เป็นซิงเกิลตันที่เป็นความลับ