รูปแบบเดี่ยว
โทน (แบบเดี่ยว) Java เป็นหนึ่งในรูปแบบการออกแบบที่ง่ายที่สุด ประเภทของรูปแบบการออกแบบนี้เป็นของสร้างสกีซึ่งมีวิธีที่ดีที่สุดในการสร้างวัตถุ
รุ่นนี้เกี่ยวข้องกับชั้นเดียวที่มีหน้าที่รับผิดชอบในการสร้างวัตถุของคุณเองในขณะที่มั่นใจว่ามีเพียงวัตถุเดียวที่ถูกสร้างขึ้น ชั้นนี้ยังมีวัตถุที่ไม่ซ้ำกันของการเยี่ยมชมของพวกเขาก็สามารถเข้าถึงได้โดยตรงที่คุณไม่จำเป็นต้องยกตัวอย่างวัตถุของคลาสที่
หมายเหตุ:
- 1 ชั้นเดี่ยวสามารถมีได้เพียงหนึ่งตัวอย่าง
- 2 ชั้นเดี่ยวต้องสร้างตัวอย่างเป็นเอกลักษณ์ของตนเอง
- 3 ชั้นเดี่ยวจะต้องให้ตัวอย่างนี้กับวัตถุอื่น ๆ ทั้งหมด
การแนะนำ
เจตนา: เพื่อให้มั่นใจว่ามีเพียงหนึ่งตัวอย่างของการเรียนและการให้บริการจุดการเข้าถึงทั่วโลกเพื่อเข้าใช้งานได้
วิธีการแก้ปัญหาหลัก: ใช้ระดับโลกที่สร้างขึ้นบ่อยครั้งและทำลาย
เมื่อจะใช้: เมื่อคุณต้องการที่จะควบคุมจำนวนของกรณีที่เมื่อเพื่อประหยัดทรัพยากรระบบ
วิธีการแก้ปัญหา: การพิจารณาว่าระบบมีอยู่แล้วนี้กรณีเดียวถ้ามันกลับมาถ้าไม่ได้สร้างแล้ว
รหัสสำคัญ: สร้างความเป็นส่วนตัว
ตัวอย่างการใช้งาน: 1, บุคคลที่สามารถมีได้เพียงหนึ่งประธาน2, Windows เป็นกระบวนการหลายแบบมัลติเธรดในการดำเนินงานของไฟล์เมื่อกระบวนการหลายอย่างหลีกเลี่ยงหรือกระทู้พร้อมกันเอกสารของปรากฏการณ์การประมวลผลของไฟล์ทั้งหมดที่ต้องดำเนินการโดยอินสแตนซ์ที่ไม่ซ้ำกัน 3 บางส่วนของผู้จัดการอุปกรณ์ที่ถูกออกแบบมามักจะเป็นรูปแบบเดียวกรณีเช่นคอมพิวเตอร์ที่มีสองเครื่องพิมพ์ในการส่งออกเมื่อมีความจำเป็นที่จะจัดการกับสองเครื่องพิมพ์ไม่สามารถพิมพ์ไฟล์เดียวกัน
ข้อดี: 1, เพียงหนึ่งตัวอย่างในหน่วยความจำลดค่าใช้จ่ายของหน่วยความจำที่พบบ่อยโดยเฉพาะอย่างยิ่งการสร้างและทำลายกรณี (เช่นโรงเรียนแคชหน้าการจัดการบ้าน)2 เพื่อหลีกเลี่ยงการเข้าพักหลายของทรัพยากร (เช่นการดำเนินงานไฟล์เขียน)
จุดด้อย: อินเตอร์เฟซที่ไม่ได้รับมรดกและความรับผิดชอบต่อความขัดแย้งเดียวหลักการชั้นเรียนควรจะกังวลเกี่ยวกับตรรกะภายในไม่ได้อยู่นอกเช่นวิธีการยกตัวอย่าง
สถานการณ์การใช้งาน: 1, ต้องมีการผลิตของหมายเลขที่ไม่ซ้ำกัน2, เคาน์เตอร์เว็บไม่ได้ฐานข้อมูลทั้งหมดในริกาครั้งกับกรณีเดียวที่จะฟื้นฟูแคช 3 วัตถุที่สร้างขึ้นโดยความจำเป็นในการบริโภคมากเกินไปทรัพยากรเช่นฉันเชื่อมต่อ / O ไปยังฐานข้อมูลและอื่น ๆ
หมายเหตุ: getInstance () วิธีการต้องใช้การประสานข้อมูลให้ตรงกันล็อค (Singleton.class) เพื่อป้องกันไม่ให้เข้ามาในหลายหัวข้อเช่นสาเหตุที่ยกตัวอย่างหลายครั้ง
การสำนึก
เราจะสร้างชั้นSingleObjectระดับSingleObjectมีคอนสตรัคส่วนตัวของตัวเองและอินสแตนซ์แบบคงที่
ระดับSingleObjectมีวิธีการแบบคงที่สำหรับการได้รับนอกเช่นคงที่SingletonPatternDemo เรียนสาธิตของเราโดยใช้ระดับSingleObject ที่จะได้รับวัตถุSingleObject
ขั้นตอนที่ 1
สร้างชั้นเดี่ยว
SingleObject.java
SingleObject คลาสที่สาธารณะ { // สร้างวัตถุ SingleObject ส่วนตัวเช่น SingleObject คง = SingleObject ใหม่ (); // ให้เอกชนปลูกสร้างเพื่อการเรียนจะไม่ถูก instantiated SingleObject ส่วนตัว () {} // รับวัตถุเพียงอย่างเดียวของสาธารณะที่มีอยู่คง SingleObject getInstance () { กลับเช่น; } โมฆะสาธารณะ ShowMessage () { System.out.println ( "Hello World!"); } }
ขั้นตอนที่ 2
รับวัตถุที่ไม่ซ้ำกันจากชั้นเดี่ยว
SingletonPatternDemo.java
SingletonPatternDemo คลาสที่สาธารณะ { ประชาชนเป็นโมฆะคง main (String args []) { // // สร้างผิดกฎหมายรวบรวมข้อผิดพลาดเวลา: สร้าง SingleObject () ไม่สามารถมองเห็นวัตถุ // SingleObject = SingleObject ใหม่ (); // รับวัตถุเพียงวัตถุที่มีอยู่ SingleObject = SingleObject.getInstance (); // แสดงการ object.showMessage (); } }
ขั้นตอนที่ 3
ตรวจสอบการส่งออก
สวัสดีชาวโลก!
หลายรูปแบบการดำเนินซิงเกิล
ใช้รูปแบบเดี่ยวหลายวิธีดังต่อไปนี้:
1 รูปแบบขี้เกียจด้ายปลอดภัย
มีการเริ่มต้นขี้เกียจ: ใช่
มีความปลอดภัยด้ายหลาย: ไม่มี
บรรลุความยาก: ง่าย
คำอธิบาย: วิธีการนี้เป็นวิธีพื้นฐานที่สุดเพื่อให้บรรลุการดำเนินงานนี้ปัญหาใหญ่ที่สุดคือไม่สนับสนุนมัลติเธรดเนื่องจากมีการล็อคไม่ตรงกันดังนั้นความเข้มงวดมันไม่ได้เป็นเดี่ยว
โหลดขี้เกียจในลักษณะนี้เห็นได้ชัดว่าไม่จำเป็นต้องมีความปลอดภัยหัวข้อการทำงานในแบบมัลติเธรดไม่ทำงาน
ตัวอย่างรหัสสินค้า:
เรียนสาธารณะ Singleton { อินสแตนซ์ซิงเกิลส่วนตัวคง; ส่วนตัวโทน () {} สาธารณะคงซิงเกิล getInstance () { ถ้า (เช่น == null) { ตัวอย่าง = ใหม่ซิงเกิล (); } กลับเช่น; } }
นำเสนอต่อไปของการใช้งานหลายสนับสนุนหลายหัวข้อ แต่แตกต่างกันในการปฏิบัติงาน
2 สไตล์ขี้เกียจด้ายปลอดภัย
มีการเริ่มต้นขี้เกียจ: ใช่
มีความปลอดภัยด้ายหลาย: ใช่
บรรลุความยาก: ง่าย
คำอธิบาย: ในลักษณะนี้มีการโหลดขี้เกียจที่ดีสามารถทำงานได้ดีในด้ายหลาย แต่เป็นมีประสิทธิภาพต่ำมาก 99% ของผู้ป่วยไม่จำเป็นต้องมีการประสาน
ประโยชน์: สายแรกคือการเริ่มต้นที่จะหลีกเลี่ยงการสูญเสียหน่วยความจำ
ข้อเสีย: ต้องถูกล็อคตรงกันเพื่อให้แน่ใจว่าเป็นกรณีเดียว แต่ล็อคจะส่งผลกระทบต่อประสิทธิภาพ
getInstance () ประสิทธิภาพการทำงานของแอพลิเคชันที่ไม่สำคัญ (ซึ่งใช้น้อยบ่อย)
ตัวอย่างรหัสสินค้า:
เรียนสาธารณะ Singleton { อินสแตนซ์ซิงเกิลส่วนตัวคง; ส่วนตัวโทน () {} สาธารณะคงตรงกันซิงเกิล getInstance () { ถ้า (เช่น == null) { ตัวอย่าง = ใหม่ซิงเกิล (); } กลับเช่น; } }
3 สูตรที่หิวโหย
มีการเริ่มต้นขี้เกียจ: ไม่มี
มีความปลอดภัยด้ายหลาย: ใช่
บรรลุความยาก: ง่าย
คำอธิบาย: เป็นเรื่องปกติมากขึ้น แต่มีแนวโน้มที่จะวัตถุขยะ
ข้อดี: ไม่ได้ล็อคมีประสิทธิภาพดีขึ้น
ข้อเสีย: กระบอกชั้นจะเริ่มต้นหน่วยความจำจะสูญเสีย
มันขึ้นอยู่กับกลไกการหลีกเลี่ยง classloder multithreading ประสานอย่างไรเช่นเมื่อมีการยกตัวอย่างกระบอกชั้นแม้ว่าระดับสาเหตุโหลดหลากหลายเหตุผลส่วนใหญ่ของรูปแบบเดี่ยวคือการเรียกวิธี getInstance แต่ก็ไม่สามารถระบุได้ มีวิธีอื่น ๆ (หรือวิธีการอื่น ๆ คงที่) จะนำไปสู่การโหลดระดับคราวนี้เห็นได้ชัดว่าไม่ถึงเช่นการเริ่มต้นผลโหลดขี้เกียจ
ตัวอย่างรหัสสินค้า:
เรียนสาธารณะ Singleton { คง instance ส่วนตัวซิงเกิลใหม่ซิงเกิล = (); ส่วนตัวโทน () {} สาธารณะคงซิงเกิล getInstance () { กลับเช่น; } }
4 ล็อคตรวจสอบอีกครั้ง / ล็อคการตรวจสอบคู่ (DCL ที่เป็นสองตรวจสอบการล็อก)
รุ่น JDK: jdk1.5 จาก
มีการเริ่มต้นขี้เกียจ: ใช่
มีความปลอดภัยด้ายหลาย: ใช่
ตระหนักถึงความยากลำบาก: ที่ซับซ้อนมากขึ้น
คำอธิบาย: วิธีการนี้ใช้กลไกดับเบิลล็อคความปลอดภัยและในกรณีของแบบมัลติเธรดในการรักษาที่มีประสิทธิภาพสูง
getInstance () ประสิทธิภาพการใช้งานที่มีความสำคัญ
ตัวอย่างรหัสสินค้า:
เรียนสาธารณะ Singleton { ส่วนตัวคงมีความผันผวนซิงเกิลเดี่ยว; ส่วนตัวโทน () {} สาธารณะคงซิงเกิล getSingleton () { ถ้า (Singleton == null) { ตรงกัน (Singleton.class) { ถ้า (Singleton == null) { ซิงเกิลใหม่ซิงเกิล = (); } } } กลับเดี่ยว; } }
5 ประเภทการลงทะเบียนเรียน / ภายในแบบคงที่
มีการเริ่มต้นขี้เกียจ: ใช่
มีความปลอดภัยด้ายหลาย: ใช่
ตระหนักถึงความยากลำบาก: ทั่วไป
คำอธิบาย: วิธีการนี้สามารถบรรลุโหมดล็อคผลเช่นเดียวกันตรวจสอบอีกครั้ง แต่การดำเนินงานได้ง่ายขึ้นเริ่มต้นใช้ขี้เกียจของสนามคงที่ควรจะใช้วิธีนี้แทนการตรวจสอบโหมดล็อค นี้จะใช้กับกรณีของสนามคงตรวจสอบอีกครั้งโหมดล็อคสามารถนำมาใช้เมื่อมีความจำเป็นในการเริ่มต้นล่าช้าเช่นสาขา
วิธีนี้ยังใช้ประโยชน์จากกลไก classloder เพื่อให้มั่นใจว่าด้ายหนึ่งเช่นการเริ่มต้นเท่านั้นที่จะมี 3 วิธีที่แตกต่างกันคือ: ตราบใดที่วิธีที่สามระดับซิงเกิลโหลดอินสแตนซ์อินสแตนซ์ (ไม่ถึงโหลดขี้เกียจ ผล) แต่วิธีการนี้เป็นชั้นซิงเกิลโหลดตัวอย่างเช่นอาจจะไม่ได้เริ่มต้น เพราะระดับ SingletonHolder ไม่ได้ถูกใช้อย่างแข็งขันแสดงเพียงผ่านวิธีการโทร getInstance ปรากฏระดับ SingletonHolder โหลดซึ่งเป็นอินสแตนซ์อินสแตนซ์ ลองคิดดูถ้าคุณยกตัวอย่างเช่นทรัพยากรมากดังนั้นจึงอยากที่จะชะลอการโหลดบนมืออื่น ๆ เมื่อคุณไม่ต้องการที่จะยกตัวอย่างรถตักดินระดับซิงเกิลเพราะไม่สามารถมั่นใจได้ว่าระดับซิงเกิลนอกจากนี้ยังอาจจะใช้งานในพื้นที่อื่น ๆ เพื่อให้เป็นไป โหลดคราวนี้ยกตัวอย่างเช่นที่ไม่เหมาะสมได้อย่างชัดเจน เวลานี้ในลักษณะนี้เมื่อเทียบกับสามชนิดแรกของวิธีที่มันเป็นที่เหมาะสมมาก
ตัวอย่างรหัสสินค้า:
เรียนสาธารณะ Singleton { ส่วนตัว SingletonHolder ระดับคงที่ { ส่วนตัวสุดท้ายคงซิงเกิลใหม่เช่น = โทน (); } ส่วนตัวโทน () {} สาธารณะคงสุดท้ายซิงเกิล getInstance () { กลับ SingletonHolder.INSTANCE; } }
6 ระบุ
รุ่น JDK: jdk1.5 จาก
มีการเริ่มต้นขี้เกียจ: ไม่มี
มีความปลอดภัยด้ายหลาย: ใช่
บรรลุความยาก: ง่าย
คำอธิบาย: การดำเนินการนี้ยังไม่ได้รับการยอมรับอย่างกว้างขวาง แต่นี้เป็นวิธีที่ดีที่สุดที่จะใช้รูปแบบเดี่ยวมันเป็นความรัดกุมมากขึ้นเป็นอันดับกลไกการสนับสนุนโดยอัตโนมัติเพื่อป้องกันไม่ให้เกิดกรณีหลายแน่นอน
วิธีนี้เป็นวิธีที่มีประสิทธิภาพเขียน Java Josh Bloch สนับสนุนวิธีการที่จะไม่เพียง แต่สามารถหลีกเลี่ยงปัญหาการประสานด้ายหลาย แต่ยังสนับสนุนกลไกอัตโนมัติเพื่อป้องกันไม่ให้เป็นอันดับ deserialization ใหม่สร้างวัตถุใหม่อย่างป้องกัน instantiation หลาย อย่างไรก็ตามตั้งแต่เข้าร่วมเฉพาะหลังจากที่คุณสมบัติ enum jdk1.5 เขียนในลักษณะนี้ไม่สามารถช่วย แต่รู้สึกแปลกในทางปฏิบัติที่ไม่ค่อยได้ใช้
โดยไม่ได้รับการโจมตีสะท้อนที่จะเรียกตัวสร้างส่วนตัว
ตัวอย่างรหัสสินค้า:
enum สาธารณะ Singleton { เช่น; โมฆะสาธารณะ whateverMethod () { } }
กฎของหัวแม่มือ: ภายใต้สถานการณ์ปกติไม่แนะนำให้ใช้ชนิดแรกและวิธีขี้เกียจประเภทที่สองก็จะแนะนำให้ใช้วิธีที่สามคนหิวเฉพาะเมื่อคุณต้องการที่จะใช้ผลการโหลดขี้เกียจเป็นที่ชัดเจนเราจะใช้ห้าชนิดแรกของวิธีที่จะลงทะเบียน ถ้ามันมาถึง deserialize วัตถุที่จะสร้างคุณสามารถลองใช้โหมดการแจงนับหก หากคุณมีความต้องการพิเศษอื่น ๆ ที่คุณสามารถพิจารณาใช้ตรวจสอบอีกครั้งที่สี่โหมดล็อค