แบบแผนซิงเกิลตัน

[thumb|โครงสร้างของคลาสซิงเกิลตัน ในแบบ [UML]]
**แบบแผนซิงเกิลตัน** () เป็นแบบแผนการออกแบบซอฟต์แวร์ที่ใช้จำกัดจำนวนอ็อบเจกต์ที่ถูกสร้างในขณะที่โปรแกรมทำงาน มีประโยชน์ในสถานการณ์ที่ทั้งระบบต้องมีอ็อบเจกต์เพียงตัวเดียวเพื่อจะได้ไม่เกิดการทำงานซ้ำซ้อนกัน ตัวอย่างเช่น คลาสที่ใช้สำหรับเป็นศูนย์รวมการตั้งค่าปรับแต่ง (configuration) ของโปรแกรมคอมพิวเตอร์ เมื่อเริ่มโปรแกรมอ็อบเจกต์ของคลาสนี้จะอ่านค่าตั้งต้นจากไฟล์ ผู้ใช้โปรแกรมสามารถทำการปรับเปลี่ยนค่าและเซฟไฟล์เพื่อการใช้งานครั้งต่อไป ในกรณีนี้เราต้องการให้ทุก ๆ ส่วนของโปรแกรมใช้อ็อบเจกต์ซิงเกิลตันเพียงตัวเดียวร่วมกัน เพื่อที่ทุกส่วนทำงานสัมพันธ์กันและไม่ต่างส่วนต่างเปลี่ยนแปลงค่าโดยส่วนอื่น ๆ ไม่รับรู้

## การนำไปใช้งาน
แบบแผนซิงเกิลตันถูกสร้างโดยเขียนคลาสให้ซ่อนคอนสทรัคเตอร์ทั้งหมดไว้จากคลาสอื่น ๆ คือให้คอนสทรัคเตอร์เป็นไพรเวท จากนั้นสร้างเมธอดมีหน้าที่สร้างอ็อบเจกต์ของคลาสนี้ถ้ายังไม่ถูกสร้างและเก็บอ็อบเจกต์ตัวที่ถูกสร้างใหม่นี้ไว้ จากนั้นส่งคืนอ็อบเจกต์เพียงตัวเดียวนั้นให้ทุกครั้งที่มีการร้องขออ็อบเจกต์ของคลาส

ข้อควรระวังสำหรับการใช้แบบแผนซิงเกิลตันในโปรแกรมที่ทำงานแบบ multi-threading คือหลายส่วนของโปรแกรมอาจจะพยายามเรียกเมธอดให้สร้างอ็อบเจกต์เป็นครั้งแรกในเวลาเดียวกัน อาจทำให้มีการสร้างอ็อบเจกต์ขึ้นมาเกินหนึ่งตัวได้ ในกรณีนี้ควรป้องกันโดยอนุญาตให้เพียงหนึ่งเทร็ดเรียกเมธอดได้ในขณะใดขณะหนึ่ง (mutually exclusive)

## ตัวอย่างโค้ด
### ภาษา C#
โค้ดตัวอย่างการใช้คลาสชิงเกิลตันในภาษาซีชาร์ปด้วยวิธีดอตเน็ต

```csharp
sealed class Singleton {
    private Singleton() {}
    public static readonly Singleton instance = new Singleton();
}
```


### ภาษา Java
ซอร์สโค้ดคลาสซิงเกิลตันในภาษาจาวา


```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
    }
}
```

    
การเรียกใช้งาน


```java
Singleton.getInstance().doWork();
```


คลาสซิงเกิลตันแบบปลอดภัยในการทำงานแบบ multi-threading โดย Bill Pugh


```java
public class ThreadSafeSingleton {
    private ThreadSafeSingleton() {
    }

    private static class SingletonHolder {
        private static ThreadSafeSingleton instance = new ThreadSafeSingleton();
    }

    public static ThreadSafeSingleton getInstance() {
        return SingletonHolder.instance;
    }
}
```


### ภาษา PHP

```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(){

    }
}
?>
```


การเรียกใช้งาน


```php
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  โดย David Geary 
* Exploring the Singleton Design Pattern 

หมวดหมู่:การเขียนโปรแกรม