คำจำกัดความ: ฟังก์ชั่นหลักของรูปแบบ Singleton คือเพื่อให้แน่ใจว่าในแอปพลิเคชัน Java มีเพียงหนึ่งอินสแตนซ์ของคลาสที่มีอยู่
ในการดำเนินการหลายอย่างเช่นการสร้างการเชื่อมต่อฐานข้อมูลไดเรกทอรีจำเป็นต้องมีการดำเนินการแบบเธรดเดียว
นอกจากนี้ Singleton สามารถเป็นรัฐได้ คลาส Singleton คุณสามารถนับจำนวนนี้และเพิ่ม 1 โดยการซิงโครไนซ์โดยอัตโนมัติหากคุณต้องการบันทึกหมายเลขนี้ลงในฐานข้อมูลอย่างถาวรคุณสามารถทำได้โดยไม่ต้องแก้ไขอินเทอร์เฟซของรัฐเดียว
นอกจากนี้ Singleton ยังสามารถไร้สัญชาติได้ ให้ฟังก์ชั่นเหมือนเครื่องมือ
โมเดล Singleton ช่วยให้เรามีความเป็นไปได้ในการใช้วิธีนี้ ข้อดีของการใช้ซิงเกิลคือมันสามารถบันทึกหน่วยความจำได้เนื่องจาก จำกัด จำนวนอินสแตนซ์และเอื้อต่อการรวบรวมขยะ Java
เรามักจะเห็นว่ารถตักคลาสจะถูกนำไปใช้ในโหมดซิงเกิลตันในโหมดโรงงานเพราะคลาสที่โหลดจริงเป็นของทรัพยากร
วิธีใช้โหมดซิงเกิลตัน
รูปแบบ Singleton ทั่วไปมักจะมีหลายรูปแบบ:
การคัดลอกรหัสมีดังนี้:
Singleton ชั้นเรียนสาธารณะ {
Private Singleton () {}
// มันไม่แปลกเลยที่จะกำหนดอินสแตนซ์ของตัวเองภายในตัวเอง?
// โปรดทราบว่านี่เป็นเรื่องส่วนตัวสำหรับการโทรภายในเท่านั้น
อินสแตนซ์แบบสแตติกส่วนตัว = ใหม่ซิงเกิล ();
// นี่คือวิธีการคงที่สำหรับการเข้าถึงภายนอกไปยังคลาสนี้ซึ่งสามารถเข้าถึงได้โดยตรง
สาธารณะสแตติก Singleton GetInstance () {
อินสแตนซ์กลับ;
-
-
รูปแบบที่สอง:
การคัดลอกรหัสมีดังนี้:
Singleton ชั้นเรียนสาธารณะ {
อินสแตนซ์แบบสแตติกส่วนตัว = NULL;
Singleton GetInstance () {
// วิธีนี้ได้รับการปรับปรุงในด้านข้างต้น
// สร้างอินสแตนซ์ระหว่างการใช้งานปรับปรุงประสิทธิภาพ!
ถ้า (อินสแตนซ์ == null)
อินสแตนซ์ = ใหม่ซิงเกิล ();
อินสแตนซ์กลับ;
-
-
Singleton.getInstance () สามารถใช้ในการเข้าถึงคลาส Singleton
รูปแบบที่สองด้านบนคือการเริ่มต้นที่ขี้เกียจซึ่งหมายความว่าซิงเกิลเริ่มต้นจะถูกเรียกเป็นครั้งแรกและไม่จำเป็นต้องสร้างในอนาคต
โปรดทราบว่าการซิงโครไนซ์ในรูปแบบการเริ่มต้นที่ขี้เกียจเป็นสิ่งสำคัญ มีการอภิปรายมากมายเกี่ยวกับการเริ่มต้นที่ขี้เกียจเกี่ยวกับการล็อคแบบตรวจสอบสองครั้ง (DCL) และผู้ที่สนใจจะศึกษาเพิ่มเติม
เป็นที่เชื่อกันโดยทั่วไปว่ารูปแบบแรกปลอดภัยกว่า
สิ่งที่ควรทราบเมื่อใช้โหมดซิงเกิลตัน
บางครั้งในบางกรณีการใช้ Singleton ไม่สามารถบรรลุวัตถุประสงค์ของ Singleton ได้ -Server และ Cross-JVM
มารับ servicelocator ของซอร์สโค้ดร้านขายสัตว์เลี้ยงของ Sun (ร้านขายสัตว์เลี้ยง 1.3.1) เป็นตัวอย่างและวิเคราะห์สั้น ๆ :
ในร้านขายสัตว์เลี้ยงมี servicelocator สองประเภทหนึ่งอยู่ในไดเรกทอรี EJB และอื่น ๆ อยู่ในเว็บไดเรกทอรี บริการวางตำแหน่ง แต่ทำไมต้องแยกพวกเขา? หลังจากการศึกษาอย่างรอบคอบของ servicelocators ทั้งสองนี้ฉันพบความแตกต่าง: Servicelocator ใช้โหมด Singleton ในเว็บ Servicelocator เป็นของการวางตำแหน่งทรัพยากรดังนั้นแน่นอนควรใช้โหมด Singleton อย่างไรก็ตามใน EJB โมเดล Singleton ได้สูญเสียฟังก์ชั่นดังนั้น Servicelocator จะแบ่งออกเป็นสองประเภทหนึ่งคือบริการเว็บและอีกประเภทหนึ่งสำหรับบริการ EJB
รูปแบบ Singleton ดูเรียบง่ายและสะดวกมากในการใช้งาน แต่มันยากมากที่จะใช้งานได้ดี