รูปแบบ Singleton เป็นรูปแบบการสร้างวัตถุที่ทำให้มั่นใจได้ว่ามีเพียงตัวอย่างเดียวของคลาสในระบบ
ในภาษา Java มีประโยชน์สองประการในการทำสิ่งนี้:
1. สำหรับวัตถุที่ใช้บ่อยเวลาที่ใช้ในการสร้างวัตถุสามารถละเว้นได้
2. เนื่องจากการลดลงของจำนวนการดำเนินการใหม่ความถี่ของการใช้หน่วยความจำระบบจะลดลงซึ่งจะช่วยลดความดันของ GC และลดเวลาสำหรับการหยุด GC ชั่วคราว
การแบ่งส่วนรูปแบบซิงเกิลตัน:
1.
ระดับสาธารณะ Singleton {Private Singleton () {System.out.println ("Singleton.singleton ()"); } ส่วนตัวสแตติกซิงเกิลซิงเกิลตัน = ใหม่ซิงเกิล (); สาธารณะคงที่ Singleton GetInstance () {return Singleton; -หมายเหตุ: ก่อนอื่นคลาส Singleton จะต้องมีตัวสร้างระดับการเข้าถึงส่วนตัวเพื่อให้แน่ใจว่า Singleton ไม่ได้สร้างอินสแตนซ์ด้วยรหัสระบบอื่น ๆ ประการที่สองตัวแปรสมาชิก Singleton และวิธี GetInstance () จะต้องคงที่
คลาสซิงเกิลตันนี้ง่ายมากในการสร้างและเชื่อถือได้มาก ข้อเสียเพียงอย่างเดียวคือไม่สามารถโหลดซิงเกิลได้อย่างแฝง ตัวอย่างเช่นเนื่องจากกระบวนการสร้างซิงเกิลนั้นช้ามากและตัวแปรสมาชิกถูกกำหนดให้เป็นแบบคงที่เมื่อ JVM โหลดคลาสซิงเกิลตันวัตถุซิงเกิลจะถูกสร้างขึ้น จากนั้นวัตถุซิงเกิลจะถูกสร้างขึ้นทุกที่ที่ใช้คลาสซิงเกิลไม่ว่าจะใช้วัตถุซิงเกิลตันหรือไม่ ตัวอย่างเช่น:
ระดับสาธารณะ Singleton {Private Singleton () {System.out.println ("Singleton.singleton ()"); } ส่วนตัวสแตติกซิงเกิลซิงเกิลตัน = ใหม่ซิงเกิล (); สาธารณะคงที่ Singleton GetInstance () {return Singleton; } โมฆะคงที่สาธารณะ createstring () {system.out.println ("singleton.createstring ()"); - 2. เพื่อปรับปรุงความเร็วในการโทรของฟังก์ชั่นที่เกี่ยวข้องจำเป็นต้องมีการแนะนำกลไกการโหลดขี้เกียจ
แพ็คเกจ com.luchao.singtonle; คลาสสาธารณะ Lazysingleton {Private Lazysingleton () {System.out.println ("Lazysingleton.lazysingleton ()"); } ส่วนตัว lazysingleton lazyinstance = null; สาธารณะที่ซิงโครไนซ์แบบคงที่ lazysingleton getInstance () {ถ้า (lazyInstance == null) lazyInstance = ใหม่ lazysingleton (); กลับ LazyInstance; -การกำหนดค่าเริ่มต้นตัวแปรแบบสแตติกแบบสแตติกนั้นเป็นโมฆะเพื่อให้แน่ใจว่าไม่มีโหลดเพิ่มเติมเมื่อระบบเริ่มต้น ในวิธีการ getInstance () มีการพิจารณาว่าอินสแตนซ์ปัจจุบันมีอยู่แล้ว ถ้ามีอยู่มันจะกลับมา หากไม่มีอยู่จะมีการสร้างซิงเกิลตัน GetInstance () จะต้องเป็นวิธีการแบบซิงโครนัสเนื่องจากในสภาพแวดล้อมแบบมัลติเธรดเมื่อเธรด 1 กำลังสร้างซิงเกิลและก่อนที่การมอบหมายจะเสร็จสิ้นเธรด 2 อาจกำหนดว่าอินสแตนซ์นั้นเป็นโมฆะดังนั้นเธรด 2 จะเริ่มโปรแกรมเพื่อสร้างซิงเกิลใหม่
ตัวอย่างด้านบนการใช้งาน Singleton ใช้การโหลดล่าช้า แต่แนะนำวิธีการซิงโครไนซ์ซึ่งใช้เวลามากกว่าโปรแกรม Singleton ครั้งแรกในสภาพแวดล้อมแบบมัลติเธรด
3. รูปแบบ Singleton ใช้คลาสภายในเพื่อรักษาการสร้าง Singletons
ชั้นเรียนสาธารณะ staticsingleton {private staticsingleton () {system.out.println ("Staticsingleton.staticsingleton ()"); } ชั้นเรียนแบบคงที่ส่วนตัว singletonholder {Statics Staticsingletleton ส่วนตัว Ataticsingleton = ใหม่ Staticsingleton (); } Statics Staticsingleton Public GetInstance () {return singletonholder.ataticsingleton; -เมื่อมีการโหลด Staticsingleton ระดับชั้นในจะไม่ถูกสร้างอินสแตนซ์เพื่อให้แน่ใจว่าคลาส Singleton จะไม่เริ่มต้นเมื่อคลาส Staticsingletleton ถูกโหลดลงใน JVM และโหลด singletonholder เมื่อวิธีการ GetInstance () ถูกเรียกใช้ นอกจากนี้ยังใช้เพื่อสร้างอินสแตนซ์เมื่อคลาสถูกโหลดดังนั้นจึงเป็นมิตรกับเธรดตามธรรมชาติ
การใช้คลาสภายในเพื่อให้โหมดผลกำไรเพียงอย่างเดียวไม่เพียง แต่สามารถโหลดล่าช้าได้ แต่ยังใช้คำหลักแบบซิงโครนัส มันเป็นวิธีที่ค่อนข้างสมบูรณ์
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์กับการเรียนรู้ของทุกคน