[Java] Singleton Design Pattern
ผมเป็นคนนึงที่รู้สึกตอนเรียนว่า ไอ้ "OOP" หรือไม่ว่าจะเป็น "Design Pattern" อะไรพวกนี้ มันเป็นศัพท์ที่ฟังแล้วให้ความรู้สึกว่ามันยากจัง แต่พอได้ลงมือจริงๆ ได้ทำมันจริงๆ (ไม่ใช่แค่ท่องแต่ทฤษฎี) ก็พอจะรู้ว่ามันก็คือการเขียนโปรแกรมธรรมดาๆ ของเราเนี่ยแหละ แต่มันอาจจะมีชื่อเรียกการเขียนแต่ละแบบเท่านั้นเอง ทำให้บางทีผมก็รู้สึกว่าโปรแกรมที่เราเคยทำมันก็เป็น Design Pattern แบบนึง และบล็อกนี้ก็จะเสนอ "Singleton" ที่เป็น Design Pattern แบบง่ายๆ แบบหนึ่งไว้ให้อ่านกันเล่นๆนะครับ
Singleton เป็นการสร้างคลาสที่มีคุณสมบัติคือ มี Object ได้เพียงตัวเดียวเท่านั้น ที่ต้องทำแบบนี้ก็เพื่อประหยัด memory ครับ ไหนๆ ก็สร้าง Object มาตัวนึงแล้ว ก็ใช้มันซะให้คุ้ม ดีกว่าไปสร้างใหม่แน่ๆครับ ถ้าถามว่ามีผลเยอะไหม ต้องลองศึกษาเกี่ยวกับ Garbage Collection ดูครับ
การประกาศ Object ของ Java ต้อง new Constructor ของคลาสขึ้นมา ถ้าคลาสที่เราสร้างใหม่ที่เราไม่ได้เขียน Contructor ไว้ จะมี Default Contructor เป็น
เพราะฉะนั้น เราต้องจัดการกับ Contructor ก่อน โดย
ทีนี้ก็จะทำให้เราไม่สามารถ new คลาสนี้ได้แล้ว
ต่อไปเราก็ทำเราประกาศ Object ภายในคลาสนี้ไว้เลย โดยกำหนดให้เป็น static เพื่อทำให้มี reference ได้เพียงที่เดียว หรือก็คือ มี Object ได้เพียงตัวเดียวนั่นเอง
หรือ เราอาจจะเขียนโดยใช้ Static Factory Method ร่วมด้วย ดังนี้
*หากสงสัยเกี่ยวกับ static/final ก็ลองตามลิงค์ไปดูนะครับ ^^ keyword และสิทธิ์การเข้าถึงตัวแปร/method ภาษา Java
การนำไปใช้ แน่นอนว่า เราจะไม่สามารถ new ได้ แต่เราสามารถเข้าถึง public static ได้ครับ
การเรียกใช้หากเขียนคลาส Singleton แบบแรก.. เป็น Singleton แบบใช้ public constant
การเรียกใช้หากเขียนคลาส Singleton แบบที่สอง.. เป็น Singleton แบบใช้ Static Factory Method
*??? หมายถึง เราอาจมี attribute หรือ method อื่นๆ ที่สามารถเข้าถึงได้ก็ให้ dot ต่อไปได้เลย เพราะว่าก้อนข้างหน้านั้น ก็คือ Object ตัวหนึ่ง เพียงแต่ว่า ไม่ว่าเราจะเขียนแบบนี้ที่ไหน ก็จะหมายถึง ตัวเดียวกัน ที่เดียวกันนั่นเอง
Singleton เป็นการสร้างคลาสที่มีคุณสมบัติคือ มี Object ได้เพียงตัวเดียวเท่านั้น ที่ต้องทำแบบนี้ก็เพื่อประหยัด memory ครับ ไหนๆ ก็สร้าง Object มาตัวนึงแล้ว ก็ใช้มันซะให้คุ้ม ดีกว่าไปสร้างใหม่แน่ๆครับ ถ้าถามว่ามีผลเยอะไหม ต้องลองศึกษาเกี่ยวกับ Garbage Collection ดูครับ
การประกาศ Object ของ Java ต้อง new Constructor ของคลาสขึ้นมา ถ้าคลาสที่เราสร้างใหม่ที่เราไม่ได้เขียน Contructor ไว้ จะมี Default Contructor เป็น
public Singleton(){}
เพราะฉะนั้น เราต้องจัดการกับ Contructor ก่อน โดย
private Singleton(){}
ทีนี้ก็จะทำให้เราไม่สามารถ new คลาสนี้ได้แล้ว
ต่อไปเราก็ทำเราประกาศ Object ภายในคลาสนี้ไว้เลย โดยกำหนดให้เป็น static เพื่อทำให้มี reference ได้เพียงที่เดียว หรือก็คือ มี Object ได้เพียงตัวเดียวนั่นเอง
class Singleton { public static final INSTANCE = new Singleton(); private Singleton(){} }
หรือ เราอาจจะเขียนโดยใช้ Static Factory Method ร่วมด้วย ดังนี้
class Singleton { private static final INSTANCE = new Singleton(); private Singleton(){} public static getInstance(){ return INSTANCE; } }
*หากสงสัยเกี่ยวกับ static/final ก็ลองตามลิงค์ไปดูนะครับ ^^ keyword และสิทธิ์การเข้าถึงตัวแปร/method ภาษา Java
การนำไปใช้ แน่นอนว่า เราจะไม่สามารถ new ได้ แต่เราสามารถเข้าถึง public static ได้ครับ
การเรียกใช้หากเขียนคลาส Singleton แบบแรก.. เป็น Singleton แบบใช้ public constant
Singleton.INSTANCE.???;
การเรียกใช้หากเขียนคลาส Singleton แบบที่สอง.. เป็น Singleton แบบใช้ Static Factory Method
Singleton.getInstance().???;
*??? หมายถึง เราอาจมี attribute หรือ method อื่นๆ ที่สามารถเข้าถึงได้ก็ให้ dot ต่อไปได้เลย เพราะว่าก้อนข้างหน้านั้น ก็คือ Object ตัวหนึ่ง เพียงแต่ว่า ไม่ว่าเราจะเขียนแบบนี้ที่ไหน ก็จะหมายถึง ตัวเดียวกัน ที่เดียวกันนั่นเอง
รูปนี้ไม่เกี่ยว แต่ "Singleton" เหมือนกัน ^^ |