รูปแบบ singleton เป็นรูปแบบในกลุ่ม creational design pattern รูปแบบ singleton เป็นรูปแบบที่อนุญาติให้สร้างออบเจกต์ของคลาสได้เพียงออบเจกต์เดียว (การเรียกที่ถูกต้องคืออินแสตนซ์เดียว) และกำหนดการเข้าถึงที่เป็นส่วนกลาง (global access ) เราใช้รูปแบบ singleton เมื่อเราต้องการให้แน่ใจว่ามีออบเจกต์ของคลาสเพียงหนึ่งออบเจกต์ในระบบ และออบเจกต์นั้นจำเป็นต้องเข้าถึงได้ง่ายโดยออบเจ็กต์อื่น รูปแบบ singleton มีประโยชน์ในหลายสถานการณ์ เช่น เมื่อเราต้องการควบคุมการเข้าถึงทรัพยากรที่ใช้ร่วมกัน หรือเมื่อเราต้องการจำกัดจำนวนออบเจกต์ของคลาสที่สามารถสร้างได้
การใช้รูปแบบ singleton เป็นการกำหนดให้เมธอดคอนสตรัคชั่นเป็น private และมีเมธอดแบบ static ที่ส่งคืนออบเจกต์เดียวของคลาส โดยครั้งแรกที่เมธอดนี้ถูกเรียกใช้ จะสร้างออบเจกต์ของคลาส และการเรียกใช้เมธอดครั้งต่อๆ ไปจะส่งกลับออบเจกต์เดียวกัน รูปแบบ singleton ยังถูกใช้ในรูปแบบการออกแบบอื่นๆด้วย เช่น builder factory pattern และ abstract factory pattern เป็นต้น
ข้อด้อยของการใช้รูปแบบ singleton เช่น (1) ในโปรแกรมแบบหลายเธรด (multi-thread) เราต้องแน่ใจว่าเราส่งคืนออบเจกต์เดียวเสมอ และเพราะมันมีรูปแบบการเข้าถึงที่เป็นส่วนกลางทำให้ยุ่งยากในการพัฒนาเพิ่มในอนาคต ยุ่งยากต่อการทำความเข้าใจ ยุ่งยากในการติดตามสถานะของออบเจกต์ ดังนั้นถ้าเรามีออบเจกต์แบบ singleton อยู่มากมายในโปรแกรมอาจจะต้องกลับมาย้อนคิดว่าเหมาะสมหรือไม่ (2) ด้วยการเข้าถึงออบเจกต์แบบ static ก็เป็นอุปสรรคต่อการพัฒนาในอนาคตเช่นกัน (3) การใช้งานออบเจกต์ก่อให้เกิดการผูกพันที่มองไม่เห็นเพราะไม่มีการใช้ออบเจกต์ผ่านฟิลด์หรือพารามิเตอร์ (4) ยากต่อการทดสอบเพราะติดตามสถานะของออบเจกต์ได้ยาก และไม่สามารถจำลอง (mockup) ออบเจกต์เพื่อการทดสอบ ดังนั้นต้องแน่ใจว่าเราต้องการควบคุมจำนวนของออบเจกต์ หรือต้องการใช้แบบการเข้าถึงที่เป็นส่วนกลาง จึงจะเลือกใช้รูปแบบนี้
ตัวอย่างโปรแกรมในภาษาจาวา
public class Singleton {
private static Singleton instance;
private Singleton() {
// private constructor to prevent instantiation
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}