แนวคิดรูปแบบซิงเกิลตัน:
รูปแบบ Singleton ใน Java เป็นรูปแบบการออกแบบทั่วไป รูปแบบ Singleton แบ่งออกเป็นสามประเภท: Lazy Singleton, Hungry Singleton และ Singleton ที่ลงทะเบียน
โหมด Singleton มีลักษณะดังต่อไปนี้:
1. มีเพียงอินสแตนซ์เดียวในคลาสซิงเกิลตัน
2. คลาส Singleton ต้องสร้างอินสแตนซ์ที่เป็นเอกลักษณ์ของตัวเอง
3. คลาส Singleton ต้องจัดเตรียมอินสแตนซ์นี้ให้กับวัตถุอื่น ๆ ทั้งหมด
รูปแบบ Singleton ช่วยให้มั่นใจได้ว่าคลาสมีเพียงหนึ่งอินสแตนซ์และสร้างมันเองและให้อินสแตนซ์นี้กับระบบทั้งหมด ในระบบคอมพิวเตอร์วัตถุไดรเวอร์สำหรับพูลเธรดแคชวัตถุบันทึกกล่องโต้ตอบเครื่องพิมพ์และการ์ดกราฟิกมักถูกออกแบบมาเป็นซิงเกิล แอปพลิเคชันเหล่านี้มีฟังก์ชั่นการทำงานของตัวจัดการทรัพยากรมากหรือน้อย คอมพิวเตอร์แต่ละเครื่องสามารถมีเครื่องพิมพ์หลายเครื่อง แต่เครื่องพิมพ์เครื่องพิมพ์เพียงเครื่องเดียวเท่านั้นที่สามารถใช้งานได้เพื่อหลีกเลี่ยงงานพิมพ์สองงานที่ถูกส่งออกไปยังเครื่องพิมพ์ในเวลาเดียวกัน คอมพิวเตอร์แต่ละเครื่องสามารถมีพอร์ตการสื่อสารได้หลายพอร์ตและระบบควรจัดการพอร์ตการสื่อสารเหล่านี้จากส่วนกลางเพื่อหลีกเลี่ยงพอร์ตการสื่อสารหนึ่งที่ถูกเรียกพร้อมกันโดยสองคำขอ ในระยะสั้นการเลือกแบบจำลองซิงเกิลคือการหลีกเลี่ยงรัฐที่ไม่สอดคล้องกันและหลีกเลี่ยงความเป็นทางการเมือง
ก่อนอื่นมาดูการใช้งาน Singleton แบบคลาสสิก
ระดับสาธารณะ Singleton {ส่วนตัว Static Singleton UniqueInstance = NULL; Private Singleton () {// มีอยู่เท่านั้นที่จะเอาชนะอินสแตนซ์ } สาธารณะคงที่ Singleton getInstance () {ถ้า (unixInTance == null) {uniuminstance = ใหม่ singleton (); } return uniqueinstance; } // วิธีอื่น ... }Singleton หลีกเลี่ยงชั้นเรียนที่สร้างอินสแตนซ์ภายนอกโดย จำกัด ตัวสร้างให้เป็นส่วนตัว ในขอบเขตของเครื่องเสมือนเดียวกันอินสแตนซ์เดียวของ Singleton สามารถเข้าถึงได้ด้วยวิธี GetInstance () เท่านั้น (ในความเป็นจริงผ่านกลไกการสะท้อนกลับของ Java คุณสามารถยกตัวอย่างชั้นเรียนด้วยโครงสร้างส่วนตัวซึ่งโดยทั่วไปจะทำให้การใช้งาน Java Singleton ทั้งหมดเป็นโมฆะปัญหานี้จะไม่ถูกกล่าวถึงที่นี่และฉันจะคิดว่ากลไกการสะท้อนกลับไม่มีอยู่จริง)
อย่างไรก็ตามการดำเนินการข้างต้นไม่ได้พิจารณาปัญหาด้านความปลอดภัยของเธรด ความปลอดภัยของเธรดหมายถึง: หากรหัสของคุณอยู่ในกระบวนการที่หลายเธรดทำงานในเวลาเดียวกันและเธรดเหล่านี้อาจเรียกใช้รหัสนี้ในเวลาเดียวกัน หากผลลัพธ์ของการรันแต่ละครั้งเหมือนกับผลลัพธ์ของการรันเธรดเดียวและค่าของตัวแปรอื่น ๆ จะเหมือนกับที่คาดไว้จะเป็นเธรดที่ปลอดภัย กล่าวอีกนัยหนึ่ง: อินเทอร์เฟซที่จัดทำโดยคลาสหรือโปรแกรมคือการดำเนินการอะตอมสำหรับเธรดหรือการสลับระหว่างหลายเธรดจะไม่ทำให้เกิดความคลุมเครือกับผลการดำเนินการของอินเทอร์เฟซนั่นคือเราไม่จำเป็นต้องพิจารณาปัญหาการซิงโครไนซ์ เห็นได้ชัดว่าการดำเนินการข้างต้นไม่เป็นไปตามข้อกำหนดด้านความปลอดภัยของด้ายและอินสแตนซ์ซิงเกิลหลายครั้งมีแนวโน้มที่จะปรากฏในสภาพแวดล้อมที่เกิดขึ้นพร้อมกัน
Public Class TestStream {ชื่อสตริงส่วนตัว; สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } // คลาสนี้สามารถมีเพียงหนึ่งอินสแตนซ์ส่วนตัว testStream () {} // ตัวสร้างที่ไม่ใช่ส่วนตัวส่วนตัว // คลาสนี้จะต้องสร้างขึ้นด้วยตัวเอง // มี 2 วิธี/*teststream สุดท้ายคงที่ test สตรีม = ใหม่ teststream ();*/ส่วนตัว teststream ts1 = null; // คลาสนี้จะต้องจัดเตรียมวัตถุอินสแตนซ์นี้โดยอัตโนมัติกับระบบทั้งหมดทดสอบสแตติกแบบคงที่ getTest () {ถ้า (ts1 == null) {ts1 = new testStream (); } ส่งคืน ts1; } โมฆะสาธารณะ getInfo () {system.out.println ("ข้อความเอาต์พุต"+ชื่อ); - Public Class Testmain {โมฆะคงที่สาธารณะหลัก (String [] args) {testStream s = testStream.getTest (); S.SetName ("จาง Xiaoxiang"); System.out.println (s.getName ()); TestStream S1 = TestStream.getTest (); s1.setName ("จาง Xiaoxiang"); System.out.println (s1.getName ()); s.getInfo (); s1.getInfo (); if (s == s1) {system.out.println ("อินสแตนซ์เดียวกันถูกสร้างขึ้น"); } อื่นถ้า (s! = s1) {system.out.println ("สร้างไม่ใช่อินสแตนซ์เดียวกัน"); } else {system.out.println ("ข้อผิดพลาดของแอปพลิเคชัน"); -ผลการทำงาน:
Zhang Xiaoxiang Zhang Xiaoxiang
ข้อความเอาต์พุตจาง Xiaoxiang
ข้อความเอาต์พุตจาง Xiaoxiang สร้างอินสแตนซ์เดียวกัน
สรุป: จากผลลัพธ์เราจะเห็นได้ว่ารูปแบบ Singleton มีแอปพลิเคชันเชิงวัตถุที่มีจุดเชื่อมต่อที่ไม่ซ้ำกันสำหรับวัตถุ ไม่ว่าจะใช้ฟังก์ชันใดแอปพลิเคชันทั้งหมดจะแบ่งปันวัตถุอินสแตนซ์
1. Hungry Singleton
// คลาส Singleton Hungry เมื่อการเริ่มต้นคลาสคลาสสาธารณะ Singleton1 ได้รับการสร้างอินสแตนซ์เอง {// // ส่วนตัวเริ่มต้นโครงสร้างส่วนตัว Singleton1 () {} // เพิ่มส่วนตัวคงที่ Singleton1 Singleton1 Single = New Singleton1 (); // วิธีการคงที่โรงงานสาธารณะคงที่ Singleton1 GetInstance () {return single; - 2. คลาส Lazy Singleton
// คลาส Laggy Singleton อินสแตนซ์ระดับสาธารณะระดับ Singleton2 เมื่อเรียกว่าชั้นสาธารณะระดับสาธารณะ Singleton2 {// ส่วนตัวเริ่มต้นคอนสตรัคเตอร์ส่วนตัว Singleton2 () {} // โปรดทราบว่าไม่มี Singleton Static Singleton2 ส่วนตัวสุดท้าย = NULL; // วิธีการคงที่จากโรงงานสาธารณะที่ซิงโครไนซ์ singleton2 getInstance () {ถ้า (single == null) {single = new singleton2 (); } return single; - 3. ชั้นเรียนซิงเกิลที่ลงทะเบียน
นำเข้า java.util.hashmap; นำเข้า java.util.map; // คลาส Singleton ที่ลงทะเบียน // คล้ายกับวิธีการในฤดูใบไม้ผลิลงทะเบียนชื่อคลาสและรับโดยตรงจากมันในครั้งต่อไป คลาสสาธารณะ Singleton3 {แผนที่คงที่ส่วนตัว <String, Singleton3> MAP = ใหม่ HashMap <String, Singleton3> (); Static {Singleton3 Single = New Singleton3 (); map.put (single.getClass (). getName (), เดี่ยว); } // ตัวสร้างค่าเริ่มต้นที่ได้รับการป้องกันการป้องกัน Singleton3 () {} // วิธีโรงงานคงที่ให้ส่งคืนอินสแตนซ์ที่ไม่ซ้ำกันของคลาสนี้สาธารณะแบบคงที่ Singleton3 GetInstance (ชื่อสตริง) {ถ้า (ชื่อ == null) {name = singleton3.class.getName (); System.out.println ("name == null"+"---> name ="+name); } if (map.get (ชื่อ) == null) {ลอง {map.put (ชื่อ, (singleton3) class.forName (ชื่อ) .newInstance ()); } catch (InstantiationException E) {E.printStackTrace (); } catch (unglegalAccessException e) {e.printStackTrace (); } catch (classnotFoundException e) {e.printStackTrace (); }} return map.get (ชื่อ); } // วิธีการเชิงพาณิชย์แผนผังสตริงสาธารณะเกี่ยวกับ () {return "สวัสดีฉัน regsingleton."; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {singleton3 single3 = singleton3.getinstance (null); System.out.println (single3.about ()); - ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น