ซิงเกิลตันแพตเทิร์น - วิกิพีเดีย

# ซิงเกิลตันแพตเทิร์น

### จากวิกิพีเดีย สารานุกรมเสรี

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

## [แก้] การนำไปใช้งาน

โครงสร้างของคลาสซิงเกิลตัน ในแบบ UML

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

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

## [แก้] ตัวอย่างโค้ด

### [แก้] ภาษา C#

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

    sealed class Singleton {

        private Singleton() {}
        public static readonly Singleton instance = new Singleton();
    }

### [แก้] ภาษาจาวา

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

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

## [แก้] อ้างอิง

- 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 ((อังกฤษ))

ดึงข้อมูลจาก "http://th.wikipedia.org../../../%E0%B8%8B/%E0%B8%B4/%E0%B8%87/%E0%B8%8B%E0%B8%B4%E0%B8%87%E0%B9%80%E0%B8%81%E0%B8%B4%E0%B8%A5%E0%B8%95%E0%B8%B1%E0%B8%99%E0%B9%81%E0%B8%9E%E0%B8%95%E0%B9%80%E0%B8%97%E0%B8%B4%E0%B8%A3%E0%B9%8C%E0%B8%99.html".

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

##### Views

- บทความ
- อภิปราย
- รุ่นปัจจุบัน

##### ค้นหา

##### ภาษาอื่น

- Deutsch
- English
- Español
- Français
- Italiano
- 日本語
- Nederlands
- Polski
- Português
- Русский
- Українська
- 中文