คำจำกัดความ: ตรวจสอบให้แน่ใจว่าคลาสมีเพียงหนึ่งอินสแตนซ์และสร้างมันเองและให้อินสแตนซ์นี้กับระบบทั้งหมด
ประเภท: สร้างแผนภาพคลาสรูปแบบคลาส:
ไดอะแกรมระดับความรู้:
1. ไดอะแกรมคลาสแบ่งออกเป็นสามส่วนชื่อแอตทริบิวต์และวิธีการ
2. ข้อมูลความคิดเห็นเริ่มต้นด้วย << และลงท้ายด้วย >>
3. Modifier + แสดงถึงสาธารณะ - หมายถึงส่วนตัว # แสดงถึงการป้องกันไม่มีอะไรหมายถึงแพ็คเกจที่มองเห็นได้
4. แอตทริบิวต์ที่ขีดเส้นใต้หรือวิธีการแสดงถึงแบบคงที่
5. เพื่อนที่ไม่คุ้นเคยกับความสัมพันธ์ระหว่างวัตถุในแผนภาพคลาสสามารถอ้างถึงบทความ: ความสัมพันธ์ระหว่างคลาสในรูปแบบการออกแบบ
โหมด Singleton ควรเป็นโหมดที่ง่ายที่สุดใน 23 โหมดการออกแบบ มันมีองค์ประกอบต่อไปนี้:
มาดูตัวอย่างง่ายๆ:
แพ็คเกจ com.wolf.action; นำเข้า java.util.hashmap; นำเข้า java.util.map; การสาธิตคลาสสาธารณะ {โมฆะสาธารณะคงที่หลัก (สตริง args []) พ่น InstantiationException, unglectexception, classnotfoundexception System.out.println ("ฉันเป็นใคร"); }} คลาสลูกชายขยายพ่อ {ชื่อสตริงส่วนตัว = "ลูกชาย"; คลาสสตริงสุดท้าย = "สาธิต"; สตริงที่ได้รับการป้องกัน getName () {return.query ("AAA"); } Public Static Son GetInstance () พ่น InstantiationException, ungleclAccessException, classnotFoundException {// นี่จะต้องเป็นเส้นทางทั่วโลกมิฉะนั้นจะกลับ (ลูกชาย) อินสแตนซ์ ("com.wolf.action.son"); }} คลาสพ่อ {แผนที่คงที่ส่วนตัว <สตริง, วัตถุ> อินสแตนซ์ = ใหม่ hashmap <สตริง, วัตถุ> (); ชื่อสตริงส่วนตัว = "คลาสพรีเมี่ยม"; void fatcher () {system.out.println ("ฉันเป็นคลาสแม่"); } การสืบค้นสตริงที่ได้รับการป้องกัน (String SQL) {return SQL + "เสร็จสิ้นแล้ว"; } อินสแตนซ์วัตถุสาธารณะสาธารณะ (String objname) พ่น InstantiationException, unlegalAccessException, classnotFoundException {ถ้า (อินสแตนซ์ (get.get (objname) == null ||! } return instance.get (objname); - รูปแบบซิงเกิลถูกแบ่งออกเป็นสองประเภทตามช่วงเวลาของการสร้างอินสแตนซ์วัตถุ: หนึ่งคือหิวซิงเกิลตันและอีกอันคือซิงเกิลที่ขี้เกียจ เมื่อมีการโหลดคลาสซิงเกิลตันซิงเกิลตันจะสร้างวัตถุให้กับการอ้างอิงของตัวเอง สไตล์ขี้เกียจจะยกตัวอย่างวัตถุเฉพาะเมื่อมีการเรียกวิธีการอินสแตนซ์ รหัสมีดังนี้:
เคสเดี่ยวสไตล์มนุษย์หิว
Public Class Singleton {Private Static Singleton Singleton = New Singleton (); Private Singleton () {} Public Static Singleton GetInstance () {return Singleton; -กรณีเดียวขี้เกียจ
Public Class Singleton {Private Static Singleton Singleton; Private Singleton () {} สาธารณะคงที่แบบคงที่ Singleton GetInstance () {ถ้า (Singleton == Null) {Singleton = New Singleton (); } return singleton; -ข้อดีของโหมดซิงเกิลตัน:
สถานการณ์ที่ใช้งานได้: เนื่องจากข้อดีข้างต้นของโหมด Singleton จึงเป็นโหมดการออกแบบที่ใช้กันทั่วไปในการเขียนโปรแกรม ฉันสรุปสิ่งที่ฉันรู้สถานการณ์ที่เหมาะสมสำหรับการใช้โหมดซิงเกิลตัน:
หมายเหตุเกี่ยวกับโหมด Singleton:
ข้อโต้แย้งเกี่ยวกับรูปแบบซิงเกิลใน Java:
หากวัตถุในโหมด Singleton ไม่ได้ใช้เป็นเวลานานมันจะถูกรวบรวมโดย JVM Garbage Collector หรือไม่? ฉันเห็นข้อมูลจำนวนมากที่พูดว่า: หากไม่มีการใช้วัตถุซิงเกิลในหน่วยความจำเป็นเวลานานมันจะถูกพิจารณาว่าเป็นขยะโดย JVM และจะถูกทำความสะอาดเมื่อทำการรวบรวมขยะ ฉันสงสัยเกี่ยวกับคำสั่งนี้ มุมมองของฉันเองคือ: ในเครื่องเสมือนฮอตสปอตเวอร์ชัน 1.6 ตัวเก็บขยะ JVM จะไม่รีไซเคิลวัตถุซิงเกิลตันเว้นแต่การเชื่อมต่อแบบคงที่ที่อ้างอิงถึงวัตถุซิงเกิลในซิงเกิลถูกตัดการเชื่อมต่อแบบเทียม
เกี่ยวกับการโต้เถียงนี้ผู้เขียนเขียนบทความแยกต่างหากเพื่อหารือเกี่ยวกับเรื่องนี้ หากคุณมีความคิดเห็นที่แตกต่างกันหรือเคยมีประสบการณ์นี้โปรดป้อนบทความการสนทนาแบบ Singleton Model: Singleton Model และ Garbage Collection เข้าร่วมในการสนทนา
Singletons หลายตัวจะปรากฏใน JVM
ในกรณีของระบบกระจายตัวรถตักหลายชั้นและ serialized หลายซิงเกิลจะถูกสร้างขึ้นซึ่งเป็นจริงอย่างไม่ต้องสงสัย ดังนั้นซิงเกิลจะถูกสร้างขึ้นใน JVM เดียวกันหรือไม่? สามารถรับเพียงซิงเกิลแบบเดียวกันโดยใช้วิธี GetInstance () ที่จัดทำโดย Singleton เว้นแต่จะใช้วิธีการสะท้อนกลับจะได้รับซิงเกิลใหม่ รหัสมีดังนี้
คลาส c = class.forname (singleton.class.getName ()); constructor ct = c.getDeclaredConstructor (); CT.SetAccessible (จริง); Singleton Singleton = (Singleton) Ct.Newinstance ();
ด้วยวิธีนี้การวิ่งแต่ละครั้งจะสร้างวัตถุซิงเกิลใหม่ ดังนั้นเมื่อใช้โหมด Singleton ระวังอย่าใช้การสะท้อนเพื่อสร้างวัตถุซิงเกิลใหม่
กระทู้ Singleton ขี้เกียจปลอดภัยหรือไม่?
ส่วนใหญ่เป็นข้อความออนไลน์บางส่วนที่รูปแบบ Singleton ที่ขี้เกียจนั้นเป็นเรื่องที่ไม่ปลอดภัย แม้แต่การเพิ่มคำหลักที่ซิงโครไนซ์ลงในวิธีการสร้างอินสแตนซ์ก็ยังคงเป็นอันตราย อย่างไรก็ตามหลังจากการเข้ารหัสการทดสอบฉันพบว่าหลังจากเพิ่มคำหลักที่ซิงโครไนซ์เพื่อแก้ไขแม้ว่าจะมีผลกระทบบางส่วนต่อประสิทธิภาพมันก็เป็นแบบเธรดที่ปลอดภัยและไม่ได้สร้างอินสแตนซ์หลายวัตถุ
มีโหมดซิงเกิลตันเพียงสองประเภทเท่านั้น: สไตล์หิวและขี้เกียจหรือไม่?
Hungry Singleton และ Lazy Singleton เป็นเพียงสองวิธีที่ค่อนข้างสำคัญและใช้กันทั่วไป ในทางทฤษฎีรูปแบบการออกแบบใด ๆ ที่สามารถใช้เพียงหนึ่งอินสแตนซ์ของคลาสสามารถเรียกได้ว่าเป็นรูปแบบ Singleton
คลาส Singleton สามารถสืบทอดได้หรือไม่?
เนื่องจากวิธีการก่อสร้างเป็นส่วนตัวจึงไม่สามารถสืบทอดได้ แต่รูปแบบอื่น ๆ อีกมากมายสามารถสืบทอดได้เช่น Singletons ที่ลงทะเบียน
จะดีกว่าไหมถ้าเป็นซิงเกิลที่หิวโหย
ใน Java, Hungry Singleton ดีกว่า Singleton ที่ขี้เกียจ ใน C ++ โดยทั่วไปจะใช้ Singletons ขี้เกียจ
รูปแบบ Singleton ค่อนข้างง่ายดังนั้นฉันจะไม่ให้การสาธิตโค้ดตัวอย่างที่นี่