แบบแผนซิงเกิลตัน (อังกฤษ: 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 () โดย Erich Gamma, Richard Helm, Ralph Johnson และ John Vlissides (Gang of four: GoF)
แหล่งข้อมูลอื่น
- Simply Singleton 2013-09-07 ที่ เวย์แบ็กแมชชีน โดย David Geary (อังกฤษ)
- Exploring the Singleton Design Pattern (อังกฤษ)
wikipedia, แบบไทย, วิกิพีเดีย, วิกิ หนังสือ, หนังสือ, ห้องสมุด, บทความ, อ่าน, ดาวน์โหลด, ฟรี, ดาวน์โหลดฟรี, mp3, วิดีโอ, mp4, 3gp, jpg, jpeg, gif, png, รูปภาพ, เพลง, เพลง, หนัง, หนังสือ, เกม, เกม, มือถือ, โทรศัพท์, Android, iOS, Apple, โทรศัพท์โมบิล, Samsung, iPhone, Xiomi, Xiaomi, Redmi, Honor, Oppo, Nokia, Sonya, MI, PC, พีซี, web, เว็บ, คอมพิวเตอร์
aebbaephnsingekiltn xngkvs Singleton pattern epnaebbaephnkarxxkaebbsxftaewrthiichcakdcanwnthithuksranginkhnathiopraekrmthangan mipraoychninsthankarnthithngrabbtxngmixxbecktephiyngtwediywephuxcaidimekidkarthangansasxnkn twxyangechnkhlasthiichsahrbepnsunyrwmkartngkhaprbaetng configuration khxngopraekrmkhxmphiwetxr emuxerimopraekrmxxbecktkhxngkhlasnicaxankhatngtncakifl phuichopraekrmsamarththakarprbepliynkhaaelaesfiflephuxkarichngankhrngtxip inkrninieratxngkarihthuk swnkhxngopraekrmichxxbecktsingekiltnephiyngtwediywrwmkn ephuxthithukswnthangansmphnthknaelaimtangswntangepliynaeplngkhaodyswnxun imrbruokhrngsrangkhxngkhlassingekiltn inaebb UMLkarnaipichnganaebbaephnsingekiltnthuksrangodyekhiynkhlasihsxnkhxnsthrkhetxrthnghmdiwcakkhlasxun khuxihkhxnsthrkhetxrepniphrewth caknnsrangemthxdmihnathisrangxxbecktkhxngkhlasnithayngimthuksrangaelaekbxxbeckttwthithuksrangihmniiw caknnsngkhunxxbecktephiyngtwediywnnihthukkhrngthimikarrxngkhxxxbecktkhxngkhlas khxkhwrrawngsahrbkarichaebbaephnsingekiltninopraekrmthithanganaebb multi threading khuxhlayswnkhxngopraekrmxaccaphyayameriykemthxdihsrangxxbecktepnkhrngaerkinewlaediywkn xacthaihmikarsrangxxbecktkhunmaekinhnungtwid inkrninikhwrpxngknodyxnuyatihephiynghnungethrderiykemthxdidinkhnaidkhnahnung mutually exclusive twxyangokhdphasa C okhdtwxyangkarichkhlaschingekiltninphasasicharpdwywithidxtent sealed class Singleton private Singleton public static readonly Singleton instance new Singleton phasa Java sxrsokhdkhlassingekiltninphasacawa 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 kareriykichngan Singleton getInstance doWork khlassingekiltnaebbplxdphyinkarthanganaebb multi threading ody Bill Pugh public class ThreadSafeSingleton private ThreadSafeSingleton private static class SingletonHolder private static ThreadSafeSingleton instance new ThreadSafeSingleton public static ThreadSafeSingleton getInstance return SingletonHolder instance phasa PHP lt 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 gt kareriykichngan Singleton getInstance gt doWork xangxingDesign Patterns Elements of Reusable Object Oriented Software ISBN 0 201 63361 2 ody Erich Gamma Richard Helm Ralph Johnson aela John Vlissides Gang of four GoF aehlngkhxmulxunSimply Singleton 2013 09 07 thi ewyaebkaemchchin ody David Geary xngkvs Exploring the Singleton Design Pattern xngkvs bthkhwamsxftaewr hrux opraekrmkhxmphiwetxrniyngepnokhrng khunsamarthchwywikiphiediyidodykarephimetimkhxmuldk