แบบแผนซิงเกิลตัน
แบบแผนซิงเกิลตัน (อังกฤษ: Singleton pattern) เป็นแบบแผนการออกแบบซอฟต์แวร์ที่ใช้จำกัดจำนวนอ็อบเจกต์ที่ถูกสร้างในขณะที่โปรแกรมทำงาน มีประโยชน์ในสถานการณ์ที่ทั้งระบบต้องมีอ็อบเจกต์เพียงตัวเดียวเพื่อจะได้ไม่เกิดการทำงานซ้ำซ้อนกัน ตัวอย่างเช่นคลาสที่ใช้สำหรับเป็นศูนย์รวมการตั้งค่าปรับแต่ง (configuration) ของโปรแกรมคอมพิวเตอร์ เมื่อเริ่มโปรแกรมอ็อบเจกต์ของคลาสนี้จะอ่านค่าตั้งต้นจากไฟล์ ผู้ใช้โปรแกรมสามารถทำการปรับเปลี่ยนค่าและเซฟไฟล์เพื่อการใช้งานครั้งต่อไป ในกรณีนี้เราต้องการให้ทุกๆ ส่วนของโปรแกรมใช้อ็อบเจกต์ซิงเกิลตันเพียงตัวเดียวร่วมกัน เพื่อที่ทุกส่วนทำงานสัมพันธ์กันและไม่ต่างส่วนต่างเปลี่ยนแปลงค่าโดยส่วนอื่นๆ ไม่รับรู้
การนำไปใช้งาน
[แก้]แบบแผนซิงเกิลตันถูกสร้างโดยเขียนคลาสให้ซ่อนคอนสทรัคเตอร์ทั้งหมดไว้จากคลาสอื่นๆ คือให้คอนสทรัคเตอร์เป็นไพรเวท จากนั้นสร้างเมธอดมีหน้าที่สร้างอ็อบเจกต์ของคลาสนี้ถ้ายังไม่ถูกสร้างและเก็บอ็อบเจกต์ตัวที่ถูกสร้างใหม่นี้ไว้ จากนั้นส่งคืนอ็อบเจกต์เพียงตัวเดียวนั้นให้ทุกครั้งที่มีการร้องขออ็อบเจกต์ของคลาส
ข้อควรระวังสำหรับการใช้แบบแผนซิงเกิลตันในโปรแกรมที่ทำงานแบบ multi-threading คือหลายส่วนของโปรแกรมอาจจะพยายามเรียกเมธอดให้สร้างอ็อบเจกต์เป็นครั้งแรกในเวลาเดียวกัน อาจทำให้มีการสร้างอ็อบเจกต์ขึ้นมาเกินหนึ่งตัวได้ ในกรณีนี้ควรป้องกันโดยอนุญาตให้เพียงหนึ่งเทร็ดเรียกเมธอดได้ในขณะใดขณะหนึ่ง (mutually exclusive)
ตัวอย่างโค้ด
[แก้]ภาษา C#
[แก้]โค้ดตัวอย่างการใช้คลาสชิงเกิลตันในภาษาซีชาร์ปด้วยวิธีดอตเน็ต
sealed class Singleton {
private Singleton() {}
public static readonly Singleton instance = new Singleton();
}
ภาษา Java
[แก้]ซอร์สโค้ดคลาสซิงเกิลตันในภาษาจาวา
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
public void doWork() {
// do something
}
}
การเรียกใช้งาน
Singleton.getInstance().doWork();
คลาสซิงเกิลตันแบบปลอดภัยในการทำงานแบบ multi-threading โดย Bill Pugh
public class ThreadSafeSingleton {
private ThreadSafeSingleton() {
}
private static class SingletonHolder {
private static ThreadSafeSingleton instance = new ThreadSafeSingleton();
}
public static ThreadSafeSingleton getInstance() {
return SingletonHolder.instance;
}
}
ภาษา PHP
[แก้]<?php
class Singleton
{
private static $single;
private function __construct() {
}
public static function getInstance() {
if (self::$single === null) {
self::$single = new Singleton();
}
return self::$single;
}
public function doWork() {
// do something
}
public function __wakeUp(){
}
public function __clone(){
}
}
?>
การเรียกใช้งาน
Singleton::getInstance()->doWork();
อ้างอิง
[แก้]- Design Patterns: Elements of Reusable Object-Oriented Software (ISBN 0-201-63361-2) โดย Erich Gamma, Richard Helm, Ralph Johnson และ John Vlissides (Gang of four: GoF)
แหล่งข้อมูลอื่น
[แก้]- Simply Singleton เก็บถาวร 2013-09-07 ที่ เวย์แบ็กแมชชีน โดย David Geary (อังกฤษ)
- Exploring the Singleton Design Pattern (อังกฤษ)