โมเดล Singleton เป็นรูปแบบการออกแบบที่ง่ายที่สุดใน 23 รุ่นการออกแบบและยังใช้กันอย่างแพร่หลายในการพัฒนาองค์กร ข้อได้เปรียบของรูปแบบ Singleton คือมีเพียงตัวอย่างเดียวในโครงการ
คุณสมบัติ: ตัวสร้างถูกแปรรูปวัตถุถูกแปรรูปและให้เฉพาะอินเทอร์เฟซการเข้าถึงภายนอก
สถานการณ์แอปพลิเคชัน:
1. ระบบจำเป็นต้องแบ่งปันทรัพยากร: เช่นระบบบันทึก, สปริงทรัพยากรตัวจัดการ ฯลฯ
2. เพื่อควบคุมการใช้ทรัพยากร: เช่นพูลเธรด
แอปพลิเคชันทั่วไปในการพัฒนาระดับองค์กรและกรอบงานทั่วไป:
Servlets ใน J2EE, ผู้จัดการทรัพยากรในฤดูใบไม้ผลิ (เช่นถั่ว), พูลการเชื่อมต่อฐานข้อมูล, พูลเธรด, ระบบบันทึก, เคาน์เตอร์เว็บไซต์ ฯลฯ
การจำแนกรูปแบบซิงเกิลตัน:
1. โหมดหิว: โหมดหิวเป็นโหมดซิงเกิลตันที่ง่ายที่สุดสำหรับรหัส แต่อินสแตนซ์จะถูกโหลดเมื่อคลาสเริ่มต้น หากไม่ได้ใช้งานทันทีระบบจะถูกโหลด รหัสเฉพาะมีดังนี้:
Singleton คลาสสาธารณะ {อินสแตนซ์แบบสแตติกส่วนตัว = ใหม่ Singleton (); Private Singleton () {} Public Static Singleton GetInstance () {อินสแตนซ์กลับ; -2. โหมดขี้เกียจ: เมื่อเทียบกับโหมดหิวโหมดขี้เกียจจะถูกสร้างอินสแตนซ์และวางไว้ในอินเทอร์เฟซภายนอกเท่านั้นที่จะประมวลผลซึ่งตระหนักถึงการโหลดล่าช้าช่วยประหยัดเวลาเริ่มต้นระบบ แต่มีสถานการณ์ที่เธรดไม่ปลอดภัย
คลาสสาธารณะ Singleton {อินสแตนซ์แบบสแตติกส่วนตัว = NULL; Private Singleton () {} Public Static Singleton GetInstance () {ถ้า (อินสแตนซ์ == null) {ส่งคืน Singleton ใหม่ (); } return อินสแตนซ์; -3. การตรวจสอบอีกครั้งล็อค: โหมดล็อคการตรวจสอบสองครั้งเป็นการอัพเกรดของโหมดขี้เกียจทำให้โหมดขี้เกียจปลอดภัย หมายเหตุ: มีปัญหาหน่วยความจำเกี่ยวกับการล็อคการตรวจสอบสองครั้งซึ่งอาจทำให้ล็อคตรวจสอบสองครั้งเป็นโมฆะ
คลาสสาธารณะ Singleton {อินสแตนซ์แบบสแตติกส่วนตัว = NULL; Private Singleton () {} Public Static Singleton GetInstance () {ถ้า (อินสแตนซ์ == null) {ซิงโครไนซ์ (singleton.class) {ถ้า (อินสแตนซ์ == null) {ส่งคืน Singleton ใหม่ (); }} ส่งคืนอินสแตนซ์; -4. โหมดคลาสภายในแบบสแตติก: คลาสภายในแบบคงที่มีทั้งโหมดขี้เกียจและชั่วร้าย: เธรด-ปลอดภัยการโหลดล่าช้า
Public Class Singleton {Private Static Class SingletonFactory {Instance Static Singleton ส่วนตัว = New Singleton (); } Private Singleton () {} สาธารณะคงที่ Singleton GetInstance () {return SingletonFactory.Instance; -5. โหมดการแจงนับระดับ: มันควรจะเป็นโหมดดอกเบี้ยเดี่ยวที่สมบูรณ์แบบที่สุดซึ่งไม่เพียง แต่ไม่เพียง แต่ความปลอดภัยของเธรด แต่ยังช่วยป้องกันปัญหาความไม่แน่นอนและการสะท้อนกลับ
Enum Singleton {อินสแตนซ์; โมฆะสาธารณะ Dosomething () {... }}รายละเอียดรูปแบบ Singleton ปัญหา:
1. การสะท้อนกลับโหมดซิงเกิล: การสะท้อนสามารถทำลายการใช้งานโหมดซิงเกิลตัน (ยกเว้นโหมดการแจงนับ)
/***ทำลายโหมด Singleton โดย Reflection*/Public Class Demo01 {โมฆะคงที่สาธารณะหลัก (String [] args) โยนข้อยกเว้น {Singleton S1 = Singleton.getInstance (); Singleton S2 = singleton.getInstance (); System.out.println (S1 == S2); คลาส <Singleton> clazz = (คลาส <Singleton>) class.forName ("com.singleton.singleton"); Constructor <Singleton> Constructor = clazz.getDeclaredConstructor (NULL); constructor.setAccessible (จริง); Singleton S3 = Constructor.NewInstance (); System.out.println (S1 == S3); }} คลาส Singleton {อินสแตนซ์แบบคงที่ส่วนตัว = ใหม่ Singleton (); Private Singleton () {// เมธอดเพื่อป้องกันการสะท้อนจากการทำลายโหมดความสนใจเดี่ยวเปิดส่วนความคิดเห็น // ถ้า (อินสแตนซ์! = null) {// โยน runtimeException ใหม่ (); //}} สาธารณะคงที่แบบคงที่ getInstance () -ในความเป็นจริงการป้องกันที่เรียกว่าหมายถึงการทำให้เป็นไปไม่ได้ที่จะสร้างผ่านการสะท้อน
2. Deserialization แบ่งรูปแบบ Singleton (ยกเว้นรูปแบบคลาสการแจงนับ)
/*** deserialization แบ่งรูปแบบซิงเกิล*/การสาธิตคลาสสาธารณะ 02 {โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {Singleton S1 = singleton.getInstance (); Singleton S2 = singleton.getInstance (); System.out.println (S1 == S2); fileOutputStream fos = ใหม่ fileOutputStream ("d: //test.txt"); ObjectOutputStream OOS = ใหม่ ObjectOutputStream (FOS); oos.writeObject (S1); oos.close (); fos.close (); ObjectInputStream OIS = ใหม่ ObjectInputStream (ใหม่ FileInputStream ("D: //test.txt")); Singleton S3 = (Singleton) ois.readObject (); System.out.println (S1 == S3); }} คลาส Singleton ใช้ serializable {อินสแตนซ์แบบสแตติกส่วนตัว = ใหม่ Singleton (); สาธารณะสแตติก Singleton GetInstance () {อินสแตนซ์กลับ; } // deserialization เริ่มต้นหากวัตถุมีอยู่แล้ววิธีนี้จะเรียกว่า // วัตถุส่วนตัว readResolve () พ่น ObjectStreameption {// ส่งคืนอินสแตนซ์; // //}}สถานการณ์ทั้งสองนี้ จำกัด อยู่ที่ความเข้าใจและไม่ได้ใช้มากในกระบวนการพัฒนาจริง
ณ จุดนี้รูปแบบซิงเกิลเสร็จสมบูรณ์
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น