1 ภาพรวม
รูปแบบซิงเกิลตันมีประโยชน์หลายประการ:
(1) คลาสบางคลาสถูกสร้างขึ้นบ่อยขึ้น สำหรับอ็อบเจ็กต์ขนาดใหญ่บางคลาส นี่เป็นโอเวอร์เฮดของระบบขนาดใหญ่
(2) ละเว้นตัวดำเนินการใหม่ ซึ่งจะลดความถี่ในการใช้หน่วยความจำระบบและลดแรงกดดัน GC
(3) คลาสบางคลาส เช่น กลไกการซื้อขายหลักของการแลกเปลี่ยน จะควบคุมกระบวนการทำธุรกรรม หากสามารถสร้างคลาสได้หลายคลาส ระบบจะเกิดความสับสนโดยสิ้นเชิง
2 คำอธิบายโดยละเอียด
การเขียนรูปแบบซิงเกิลตันที่นิยมใช้กันทั่วไปมี 2 วิธีดังนี้
2.1 หิวสไตล์จีน
หากแอปพลิเคชันสร้างและใช้รูปแบบซิงเกิลตันเสมอ หรือหากแรงกดดันในการสร้างและรันไทม์ไม่สูงมาก คุณสามารถใช้ตัวแปรคงที่ส่วนตัวเพื่อสร้างออบเจ็กต์ล่วงหน้าได้
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ org.scott.singleton;
-
* @ผู้เขียน สกอตต์
* @เวอร์ชั่น 2013-11-16
* @คำอธิบาย
-
คลาสสาธารณะ Singleton1 {
Singleton1 แบบคงที่ส่วนตัว singleInstance = new Singleton1 ();
ซิงเกิลตัน1(){ ส่วนตัว
-
Singleton1 สาธารณะคงที่ getInstance () {
กลับอินสแตนซ์ที่ไม่ซ้ำกัน;
-
-
ในกรณีนี้ เมื่อ JVM โหลดคลาสนี้ อ็อบเจ็กต์จะถูกสร้างขึ้นตามลำดับการเริ่มต้น ในเวลาเดียวกัน JVM สามารถรับประกันได้ว่าเธรดใดๆ จะต้องสร้างอินสแตนซ์นี้ก่อนและเพียงครั้งเดียวก่อนที่จะเข้าถึงออบเจ็กต์ซิงเกิลตันนี้
แน่นอน คุณยังสามารถใช้คลาสภายในแบบคงที่เพื่อทำหน้าที่เดียวกันให้สำเร็จได้
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ org.scott.singleton;
-
* @ผู้เขียน สกอตต์
* @เวอร์ชั่น 2013-11-16
* @คำอธิบาย
-
คลาสสาธารณะ Singleton2 {
Singleton2 ส่วนตัว () {
-
-
* คลาสภายในถูกใช้ที่นี่เพื่อรักษาซิงเกิลตัน
-
SingletonFactory คลาสคงที่ส่วนตัว {
อินสแตนซ์ Singleton2 แบบคงที่ส่วนตัว = Singleton2 ใหม่ ();
-
Singleton2 getInstance สาธารณะแบบคงที่ () {
กลับ SingletonFactory.instance;
-
-
* หากใช้อ็อบเจ็กต์สำหรับซีเรียลไลซ์ สามารถรับประกันได้ว่าออบเจ็กต์ยังคงความสอดคล้องทั้งก่อนและหลังซีเรียลไลซ์
-
วัตถุสาธารณะ readResolve () {
กลับ getInstance();
-
-
2.2 วิธีการล็อคสองครั้ง
"ล็อคสองครั้ง" ตามชื่อคือล็อคสองอัน ล็อคแรกใช้เพื่อตรวจสอบว่าวัตถุอินสแตนซ์ที่จะสร้างนั้นถูกสร้างขึ้นหรือไม่ หากไม่ได้ถูกสร้างขึ้น ล็อคที่สองจะถูกใช้สำหรับการซิงโครไนซ์
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ org.scott.singleton;
-
* @ผู้เขียน สกอตต์
* @เวอร์ชั่น 2013-11-16
* @คำอธิบาย
-
คลาสสาธารณะ Singleton3 {
ส่วนตัวระเหยคงที่ Singleton3 UniqueInstance;
Singleton3 ส่วนตัว () {
-
Singleton3 getInstance () สาธารณะแบบคงที่
ถ้า (อินสแตนซ์ที่ไม่ซ้ำ == null) {
ซิงโครไนซ์ (Singleton3.class) {
ถ้า (อินสแตนซ์ที่ไม่ซ้ำกัน == null) {
UniqueInstance = ใหม่ Singleton3();
-
-
-
กลับอินสแตนซ์ที่ไม่ซ้ำกัน;
-
-
หากข้อกำหนดด้านประสิทธิภาพค่อนข้างสูง วิธีนี้สามารถลดเวลาในการสร้างได้อย่างมาก ในปัจจุบัน วิธีนี้ยังเป็นวิธีที่ใช้กันทั่วไปในการสร้างซิงเกิลตัน