บทความนี้แบ่งปันรหัสเฉพาะของรูปแบบการออกแบบ Singleton ของรูปแบบการออกแบบ Java สำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
แนวคิด:
รูปแบบ Singleton: มีเพียงหนึ่งอินสแตนซ์ในชั้นเรียน
คลาสมีและเพียงหนึ่งอินสแตนซ์และให้จุดเชื่อมต่อทั่วโลก
สาเหตุของการใช้โหมดนี้:
เมื่อเราท่องเว็บไซต์เว็บไซต์บางแห่งจะแสดง "จำนวนคนออนไลน์ปัจจุบัน" โดยทั่วไปวิธีการใช้ฟังก์ชั่นนี้คือการจัดเก็บ IP ที่เข้าสู่ระบบแต่ละครั้งในหน่วยความจำไฟล์หรือฐานข้อมูลและ IP เพิ่มเติมแต่ละรายการจะทำได้ "+1" โดยทั่วไปมันเป็นวิธีการเช่น add () เพื่อตระหนักถึงฟังก์ชั่นของ "+1" ตัวอย่างเช่นใช้คำสั่ง "อัปเดต" เพื่อรับข้อมูลที่เก็บไว้ในฐานข้อมูลก่อนจากนั้น +1 อัปเดตข้อมูลในฐานข้อมูลจากนั้นบันทึก เมื่อแสดงบนหน้าคุณสามารถรับข้อมูลในฐานข้อมูลด้วยวิธีอื่น อย่างไรก็ตามเมื่อผู้ใช้หลายคนเข้าสู่ระบบในเวลาเดียวกันหากแต่ละคนต้องการวัตถุใหม่จากนั้นเรียกใช้วิธีการเพิ่ม () ผ่านการโทร "Name. Method Name" จากนั้นจัดเก็บข้อมูลในฐานข้อมูลสิ่งนี้จะทำให้ผู้ใช้หลายคนไม่สามารถบันทึกข้อมูลผู้ใช้จริงลงในฐานข้อมูลได้อย่างถูกต้อง ดังนั้นการออกแบบเคาน์เตอร์นี้เป็นวัตถุระดับโลก (ทุกคนใช้วัตถุนี้แทนที่จะเป็นหนึ่งใหม่ใหม่) และทุกคนแบ่งปันข้อมูลเดียวกันสามารถหลีกเลี่ยงปัญหาที่คล้ายกัน นี่คือหนึ่งในแอปพลิเคชั่นของรูปแบบซิงเกิลที่เราเรียก
ในทำนองเดียวกันในสถานการณ์อื่น ๆ จะพบสถานการณ์ที่คล้ายกันและจะใช้ความคิดที่คล้ายกัน ตัวอย่างเช่น:
1. ทรัพยากรภายนอก: คอมพิวเตอร์แต่ละเครื่องมีเครื่องพิมพ์หลายเครื่อง แต่สามารถใช้เครื่องพิมพ์เพียงเครื่องเดียวเพียงเครื่องเดียวเพื่อหลีกเลี่ยงงานพิมพ์สองงานที่ส่งออกไปยังเครื่องพิมพ์ในเวลาเดียวกัน ทรัพยากรภายใน: ซอฟต์แวร์ส่วนใหญ่มีไฟล์แอตทริบิวต์หนึ่ง (หรือมากกว่า) เพื่อจัดเก็บการกำหนดค่าระบบ ระบบดังกล่าวควรมีวัตถุในการจัดการไฟล์แอตทริบิวต์เหล่านี้ 2. ตัวจัดการงานของ Windows (Task Manager) เป็นโหมด Singleton ทั่วไป (เป็นที่คุ้นเคยมาก) ลองคิดดูสิคุณสามารถเปิดผู้จัดการงาน Windows สองตัวได้หรือไม่? ถ้าคุณไม่เชื่อลองด้วยตัวเอง ~
3. รีไซเคิลถังขยะสำหรับ Windows เป็นแอปพลิเคชั่น Singleton ทั่วไป ในระหว่างการทำงานของระบบทั้งหมดถังขยะรีไซเคิลยังคงรักษาเพียงหนึ่งอินสแตนซ์
4. ตัวนับของเว็บไซต์โดยทั่วไปจะถูกนำไปใช้ในโหมดซิงเกิลตันมิฉะนั้นจะเป็นการยากที่จะซิงโครไนซ์
5. แอปพลิเคชันบันทึกแอปพลิเคชันสามารถนำไปใช้ในโหมด Singleton ได้อย่างไร โดยทั่วไปแล้วเนื่องจากไฟล์บันทึกที่ใช้ร่วมกันเปิดอยู่เสมอเพราะสามารถมีเพียงอินสแตนซ์เดียวเท่านั้นที่จะใช้งานมิฉะนั้นเนื้อหาจะเพิ่มได้ยาก
6. โหมด Singleton โดยทั่วไปใช้สำหรับการอ่านวัตถุการกำหนดค่าในเว็บแอปพลิเคชันเนื่องจากไฟล์การกำหนดค่าเป็นทรัพยากรที่ใช้ร่วมกัน
7. การออกแบบพูลการเชื่อมต่อฐานข้อมูลโดยทั่วไปใช้โหมดซิงเกิลตันเนื่องจากการเชื่อมต่อฐานข้อมูลเป็นทรัพยากรฐานข้อมูล การใช้พูลการเชื่อมต่อฐานข้อมูลในระบบซอฟต์แวร์ฐานข้อมูลส่วนใหญ่จะช่วยลดการสูญเสียประสิทธิภาพที่เกิดจากการเปิดหรือปิดการเชื่อมต่อฐานข้อมูล การสูญเสียประสิทธิภาพนี้ยังคงมีราคาแพงมากเนื่องจากโหมด Singleton สามารถลดการสูญเสียนี้ได้อย่างมาก
8. การออกแบบพูลเธรดมัลติเธรดโดยทั่วไปใช้โหมด Singleton เนื่องจากพูลเธรดจำเป็นต้องอำนวยความสะดวกในการควบคุมเธรดในพูล
9. ระบบไฟล์ของระบบปฏิบัติการเป็นตัวอย่างเฉพาะของการใช้งานโหมดซิงเกิลขนาดใหญ่ ระบบปฏิบัติการสามารถมีระบบไฟล์เดียวเท่านั้น
10. HTTPapplication ยังเป็นแอปพลิเคชั่นทั่วไปของตัวอย่างหน่วย ใครก็ตามที่คุ้นเคยกับวงจรชีวิตการร้องขอทั้งหมดของ ASP.NET (IIS) ควรรู้ว่า httpapplication เป็นรูปแบบ Singleton และ HTTPModules ทั้งหมดแบ่งปันอินสแตนซ์ httpapplication
เพื่อสรุปสถานการณ์แอปพลิเคชันทั่วไปของโหมด Singleton คือ:
1. วัตถุที่ต้องมีการสร้างอินสแตนซ์บ่อยครั้งแล้วทำลาย
2. วัตถุที่ใช้เวลามากเกินไปหรือทรัพยากรมากเกินไปเมื่อสร้างวัตถุ แต่มักจะใช้
3. วัตถุที่มีลักษณะคล้ายเครื่องมือ
4. การเข้าถึงฐานข้อมูลหรือวัตถุไฟล์บ่อยครั้ง
5. ในกรณีของการแบ่งปันทรัพยากรหลีกเลี่ยงประสิทธิภาพหรือการสูญเสียที่เกิดจากการดำเนินการทรัพยากร เช่นไฟล์บันทึกการกำหนดค่าแอปพลิเคชัน ฯลฯ ในด้านบน
6. เมื่อควบคุมทรัพยากรให้อำนวยความสะดวกในการสื่อสารร่วมกันระหว่างทรัพยากร เช่นพูลเธรด ฯลฯ
คุณสมบัติ:
1. มีเพียงอินสแตนซ์เดียวในชั้นเรียนซิงเกิล
2. คลาส Singleton ต้องสร้างอินสแตนซ์ที่เป็นเอกลักษณ์ของตัวเอง
3. คลาส Singleton ต้องจัดเตรียมอินสแตนซ์นี้ให้กับวัตถุอื่น ๆ ทั้งหมด
องค์ประกอบรูปแบบซิงเกิลตัน:
1. วิธีการก่อสร้างส่วนตัว
2. จุดอ้างอิงคงที่ส่วนตัวถึงอินสแตนซ์ของคุณเอง
3. วิธีการคงที่สาธารณะที่มีอินสแตนซ์ของตัวเองเป็นค่าส่งคืน
มีสามวิธีในการใช้รูปแบบ Singleton:
1. สไตล์หิว: อินสแตนซ์ซิงเกิลถูกสร้างขึ้นเมื่อการโหลดชั้นเรียนและเริ่มต้นอย่างเร่งด่วน (วิธีการโหลดล่วงหน้า)
/*** สไตล์ Man Hungry (แนะนำ) **/การทดสอบระดับสาธารณะ {การทดสอบส่วนตัว () {} อินสแตนซ์การทดสอบแบบคงที่สาธารณะ = การทดสอบใหม่ (); การทดสอบสาธารณะ getInstance () {อินสแตนซ์กลับ; - ข้อได้เปรียบ
1. ความปลอดภัยของด้าย
2. วัตถุคงที่ถูกสร้างขึ้นในขณะที่คลาสกำลังโหลดและความเร็วในการตอบสนองเร็วเมื่อเรียกมัน
ข้อบกพร่อง
ประสิทธิภาพของทรัพยากรไม่สูงและ GetInstance () อาจไม่ถูกดำเนินการ แต่ถ้าวิธีการคงที่อื่น ๆ ของคลาสถูกดำเนินการหรือคลาส (คลาส. forName) จะถูกโหลดแล้วอินสแตนซ์นี้ยังคงเริ่มต้น
2. สไตล์ขี้เกียจ: อินสแตนซ์ซิงเกิลถูกสร้างขึ้นเมื่อใช้เป็นครั้งแรกและเริ่มต้น
การทดสอบคลาส {การทดสอบส่วนตัว () {} อินสแตนซ์การทดสอบแบบคงที่สาธารณะ = null; การทดสอบแบบคงที่สาธารณะ getInstance () {ถ้า (อินสแตนซ์ == null) {// เมื่อหลายเธรดกำหนดว่าอินสแตนซ์เป็นโมฆะหลายเธรดจะมีการทำซ้ำเมื่อดำเนินการอินสแตนซ์การดำเนินการใหม่ = ใหม่ singleton2 (); } return อินสแตนซ์; - ข้อได้เปรียบ
หลีกเลี่ยงการสร้างกรณีโดยไม่ใช้พวกเขาในรูปแบบของผู้ชายที่หิวโหย อัตราการใช้ทรัพยากรสูง หากคุณไม่ดำเนินการ getInstance () คุณจะไม่ได้รับการปรับปรุง วิธีการคงที่อื่น ๆ ของคลาสนี้สามารถดำเนินการได้
ข้อบกพร่อง
ไม่มีปัญหากับสไตล์ขี้เกียจในเธรดเดียว แต่เมื่อเพื่อนร่วมงานเข้าถึงหลายเธรดพวกเขาอาจสร้างหลายอินสแตนซ์และหลายอินสแตนซ์เหล่านี้ไม่ใช่วัตถุเดียวกัน แม้ว่าอินสแตนซ์ที่สร้างขึ้นในภายหลังจะเขียนทับอินสแตนซ์ที่สร้างขึ้นก่อน แต่จะยังคงมีกรณีที่ได้รับวัตถุที่แตกต่างกัน การแก้ปัญหานี้คือการล็อคการซิงโครไนซ์ซึ่งไม่เร็วพอเมื่อโหลดเป็นครั้งแรกและค่าใช้จ่ายในการซิงโครไนซ์ที่ไม่จำเป็นของมัลติเธรดสูง
3. การตรวจจับสองครั้ง
การทดสอบคลาส {การทดสอบส่วนตัว () {} อินสแตนซ์การทดสอบแบบคงที่สาธารณะ = null; การทดสอบแบบคงที่สาธารณะ getInstance () {ถ้า (อินสแตนซ์ == null) {ซิงโครไนซ์ (test.class) {ถ้า (อินสแตนซ์ == null) {อินสแตนซ์ = การทดสอบใหม่ (); }} ส่งคืนอินสแตนซ์; - ข้อได้เปรียบ
อัตราการใช้ทรัพยากรสูง หากคุณไม่ดำเนินการ getInstance () คุณจะไม่ได้รับการปรับปรุง คุณสามารถเรียกใช้วิธีการคงที่อื่น ๆ ของคลาสนี้
ข้อบกพร่อง
การตอบสนองไม่เร็วเมื่อโหลดเป็นครั้งแรกและบางครั้งก็ล้มเหลวเนื่องจากเหตุผลบางอย่างของโมเดลหน่วยความจำ Java
4. ชั้นเรียนภายในแบบคงที่
การทดสอบคลาส {การทดสอบส่วนตัว () {} คลาสคงที่คลาสคงที่ SingletonHelp {อินสแตนซ์ทดสอบแบบคงที่ = การทดสอบใหม่ (); } การทดสอบแบบคงที่สาธารณะ getInstance () {return singletonhelp.instance; - ข้อได้เปรียบ
อัตราการใช้ทรัพยากรสูงและไม่ได้ดำเนินการโดยไม่ได้รับอินสแตนซ์ คุณสามารถเรียกใช้วิธีการคงที่อื่น ๆ ของคลาสนี้
ข้อบกพร่อง
ไม่เร็วพอเมื่อโหลดเป็นครั้งแรก
สรุป:
โดยทั่วไปจะใช้สไตล์หิว หากคุณใส่ใจเกี่ยวกับทรัพยากรเป็นอย่างมากคุณสามารถใช้ประเภทภายในแบบคงที่ ไม่แนะนำให้ใช้สไตล์ขี้เกียจและการตรวจจับสองครั้ง
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น