Table of Contents

แนะนํา: รูป แบบ ของซิงเกิล ตัน ใน โปรแกรม ด้าน วิศวกรรม หลาย หลาก ที่ อ่าน แล้ว

แบบซิงเกิลตันเป็นหนึ่งในรูปแบบการออกแบบที่แพร่หลายที่สุดในวิศวกรรมซอฟต์แวร์ มันทําให้แน่ใจว่า คลาสจะมีเพียง 1 กรณี และให้สิทธิ์ในการเข้าถึงข้อมูลนั้นในการใช้งานทั่วโลก ในโปรแกรมแบบเดียว ๆ ที่โปรแกรมหนึ่ง ๆ ที่ถูกสั่งงานอย่างตรงไปตรงมา คือ การสร้างระบบโครงสร้างแบบส่วนตัวอย่างตรงไปตรงมา ให้จัดรูปแบบแบบตายตัวแบบหนึ่งซึ่งส่งผลให้เกิดความกระตือรือร้นหรือขี้เกียจ อย่างไรก็ตาม ในโปรแกรมวิศวกรรมหลายแบบ เช่น ระบบที่อ่านแล้ว เช่น ระบบการค้าแบบหลายระบบ โครงสร้างสูง ระบบควบคุมการทํางานจริง ๆ และระบบต่างๆ

บทความ นี้ จะ พิจารณา สาเหตุ ที่ แท้ จริง ของ ความ ผิด พลาด ที่ พบ บ่อย ที่ สุด เมื่อ ทํา การ วิจัย โดย ใช้ รูป แบบ ชีวิต แบบ เดียว กัน ใน หลาย ๆ ด้าน ซึ่ง มี การ อธิบาย และ ให้ คํา แนะ นํา เกี่ยว กับ วิธี การ ที่ ดี ที่ สุด และ รูป แบบ ต่าง ๆ เพื่อ หลีก เลี่ยง การ ทํา ผิด.

ความ ผิด พลาด ทั่ว ไป ใน การ ขาด ความ มั่น ใจ ใน ตัว เอง

แม้ แต่ นัก พัฒนา ที่ มี ประสบการณ์ ก็ อาจ ตก เข้า สู่ กับ ดัก เมื่อ ใช้ ซิงเกิล ใน ระบบ ปรับ ตั้ง.

1. ไม่ให้เป็น กรมผู้บังคับการส่วนพระองค์

พื้นฐานของซิงเกิลคือตัวช่วยสร้างส่วนตัวที่ป้องกันการกระตุ้นภายนอก หากตัวสร้างสามารถใช้งาน (แบบเปิดเผย, ป้องกัน, หรือแพกเกจ), เธรดใด ๆ สามารถสร้างโพรเซสใหม่ได้, ทําการยกเลิกสัญญาซิงเกิลแบบบล็อก โดยในรหัสหลาย ๆ ตัวอาจจะเกิดขึ้นโดยไม่ตั้งใจ เมื่อมีการปรับเปลี่ยนรุ่น และตัวสร้างข้อมูลแบบ โดยอัตโนมัติ หรือเมื่อระบบย่อยของซิงเกิลถูกย่อยย่อย (ซึ่งโดยทั่วไปเป็นรุ่นย่อยที่ถูกรองรับ) จะประกาศการสร้างแบบส่วนตัวเสมอ หากคุณต้องรองรับการรองรับ (หรือใช้แฟ้ม) การป้องกันการสร้างเอกสารอย่างเข้มงวด และต้องการใช้พฤติกรรมที่คาดหวัง

2. ไม่สามารถจัดการความปลอดภัยเธรด

ในสภาพแวดล้อมแบบอ่านได้แบบเดียว การเริ่มต้นแบบขี้เกียจก็ใช้ได้ดี

public class Singleton {
 private static Singleton instance;
 private Singleton() {}
 public static Singleton getInstance() {
 if (instance == null) {
 instance = new Singleton();
 }
 return instance;
 }
}

แต่ในโปรแกรมหลายแบบ สามารถเข้าตรวจสอบซ้ําได้ซ้ําสองเธรด โดยเพิ่ม [FLT: 1) เข้าอีกครั้ง [FLT: 1) ก่อนที่เธรดใด ๆ จะสร้างโพรเซสขึ้นมา แต่ละเธรดก็จะดําเนินการสร้างวัตถุของมันเอง ซึ่งจะละเมิดรูปแบบ ต่อไปนี้เป็นเงื่อนไขคลาสสิก [FTT: 0] การติดตาม [FLT: 1) ที่มีผลในหลายกรณี และนําไปสู่ความไม่สอดคล้องกันของสถานะ หรือการปล่อยข้อมูลออกมา

3. ใช้การเริ่มต้นขี้เกียจโดยไม่มีการปรับเทียบตําแหน่งที่เหมาะสม

แม้ แต่ นัก พัฒนา ที่ ยอม รับ ความ จําเป็น ที่ ต้อง มี ความ ปลอด ภัย ใน ด้าย ก็ มัก จะ เพิ่ม ความ กลมกลืน อย่าง ไม่ บังควร.

public static synchronized Singleton getInstance() { ... }

การเรียก [FLT: 5] ทุกสายสามารถเปิดและปล่อยล็อคได้ แม้หลังจากมีการสร้างตัวอย่างที่ตั้งไว้แล้ว แต่สถานการณ์การออกเสียงแบบมีขอบเขตสูงนี้สามารถลดค่าเสียงลงได้มาก วิธีที่ดีกว่าคือการใช้ [FT: 0] การล็อค (FLT: 1) แบบบวช: 1) (แยก) แต่รูปแบบดังกล่าวก็ทําหน้าที่ได้อย่างถูกต้อง

4. ใช้การปรับเทียบข้อมูล

Sythervarition (FLT: 6) วิธี (FLT:6) [FT: 7] บล็อก [FLT: 8] [FLT: ⁇ ] [FLT: ⁇ และอื่น ๆ ] และอื่น ๆ อีก – over-signer properation — over-grained crack (Fried-grained control) เมื่อมีการใช้งานแบบดี-grained control) chive appy applications (e. requestments (e. request) ในบางระบบวิศวกรรมบางระบบที่มีงบประมาณที่เข้มงวด) นาโนแม้กระทั่ง นาโนของค่าใช้จ่ายยังสามารถล็อคได้ เป้าหมายสําคัญในการจําแนกส่วนความปลอดภัยของกลุ่มของกลุ่มเมฆ (UniversPREKLEST)

5. ไม่สนใจ [FLT: 0] volatile คําสําคัญ

ในภาษาเช่น Java, C# และ C++ (ร่วมกับ [FLT: 10]] ) , [FLT: 0] เวิร์ดไวล์ เป็นกุญแจสําคัญในการแยกแยะที่ถูกต้องในรหัสหลายแบบแบบอ่านผิด ๆ ถ้าไม่มีมัน CPU อาจจัดลําดับใหม่ และเปลี่ยนแปลงโดยเส้นด้ายหนึ่งอาจจะมองไม่เห็นรูปแบบการยึดแบบคู่ การไม่เปิดเผยตัวแบบ [FLT: 11] สามารถทําให้เกิดการจําแนกวัตถุที่หลากหลายได้ ซึ่งทําให้พฤติกรรมที่คาดเดาไม่ได้ และข้อผิดพลาดมากที่สุดเกิดขึ้น

การปฏิบัติที่ดีที่สุดสําหรับ momp-secute loading

เพื่อ หลีก เลี่ยง หลุม พราง เหล่า นี้ จง ติด ตาม กล อุบาย ที่ ได้ รับ การ พิสูจน์ แล้ว.

ผู้ ประสาน งาน ส่วน ตัว และ ผู้ เชี่ยวชาญ ด้าน การ รักษา

ไม่ว่าจะเป็นกลยุทธ์เริ่มต้น ตัวสร้างต้องเป็นความลับ ตัวสร้างซิงเกิลควรจะถูกเก็บไว้ในสนามที่คงที่ อย่าเปิดเผยตัวสร้างในแนวใด ๆ และพิจารณาทําชั้น (FLT: 12) ในจาวา (หรือ เพื่อป้องกันการสอนชั้นชั้นย่อย

ใช้บล็อกที่ปรับเทียบได้เมื่อจําเป็น@ info: whatsthis

สําหรับการเริ่มต้นที่ขี้เกียจ รูปแบบการล็อคสองนัด จะลดการประสานบนหัวของหัวเรื่อง:

public class Singleton {
 private static volatile Singleton instance;

 private Singleton() {}

 public static Singleton getInstance() {
 Singleton result = instance; // Local variable for performance
 if (result == null) {
 synchronized (Singleton.class) {
 result = instance;
 if (result == null) {
 instance = result = new Singleton();
 }
 }
 }
 return result;
 }
}

ในรหัสนี้ จะตรวจสอบ [FLT: 15] นอกบล็อกที่เชื่อมต่อกัน จะหลีกเลี่ยงการล็อคค่าเหนือหน้าต่างเมื่อมีโพรเซสอยู่แล้ว การตรวจสอบภายในจะทําให้แน่ใจว่ามีเธรดเพียงหนึ่งเธรดที่สร้างโพรเซสขึ้นมาเป็นโพรเซสเท่านั้น ปุ่มพิมพ์ [FLT: 16] จะป้องกันไม่ให้คําสั่งคําสั่งคําสั่งทํางานซ้ํา และตรวจสอบได้ว่างาน [FTT: 17] จะมองเห็นได้อย่างสมบูรณ์ โปรดสังเกตว่า เราบันทึกค่าตัวแปรของตัวแปรภายในเครื่องได้ถูกต้องในการใช้งานจาวา+ (กับหน่วยความจําที่ถูกต้อง) และใช้ค่า C+(FT) ในรูปแบบเดียวกัน (FT)+(FT)+(F) + (F18) ด้วยลําดับที่:

การเริ่มการเริ่มการกระตือรือร้น

ถ้าซิงเกิลตันจําเป็น และการสร้างนั้นราคาถูก ความกระตือรือร้นในการเริ่มต้นเป็นวิธีปลอดภัยของด้ายที่ง่ายที่สุด

public class Singleton {
 private static final Singleton INSTANCE = new Singleton();

 private Singleton() {}

 public static Singleton getInstance() {
 return INSTANCE;
 }
}

การโหลดคลาสนั้นมีการปรับเทียบข้อมูลกับ JVM เท่านั้น จึงไม่มีความจําเป็นในการประสานงานเพิ่มเติม อย่างไรก็ตาม การโหลดนี้ได้สร้างโพรเซสที่เวลาของคลาสโหลด ซึ่งอาจจะไม่ต้องการในการประมวลผลทรัพยากร หรือเมื่อซิงเกิลตันขึ้นอยู่กับค่าเวลาทํางาน ที่ยังไม่มีอยู่

รูปแบบการจับอาการ (การปรับสีให้คงที่บนแผ่น)

รูปแบบนี้รวมการเริ่มใช้งานแบบขี้เกียจเข้ากับความปลอดภัยของเธรดโดยไม่ต้องทําความสอดคล้องกัน:

public class Singleton {
 private Singleton() {}

 private static class Holder {
 static final Singleton INSTANCE = new Singleton();
 }

 public static Singleton getInstance() {
 return Holder.INSTANCE;
 }
}

2555) คลาส จะโหลดเมื่อ [FLT: 22] มีชื่อว่า "1 ง)" และ JVM รับการรับรองความปลอดภัยของสนามไฟฟ้าระหว่างการโหลดคลาส เพลงนี้ถือว่าเป็นการแก้ปัญหาที่งดงามที่สุดสําหรับจาวาซิงเกิลตัน (พ.ศ.

Enum-based ซิงเกิล (Java)

Java [[FLT: 1) แนะนําใช้ enum:

public enum Singleton {
 INSTANCE;

 // methods and fields
}

Enum ค่าคงที่จะถูกจําแนก [FLT: 24] และภาษาจาวายืนยันว่าตัวร่วมถูกสร้างขึ้นเพียงหนึ่งครั้ง หรือแม้จะถูกกระตุ้นให้สะท้อนกลับได้ ทั้งนี้ทั้งการรักษาความปลอดภัยและความไวแสง แต่ตัว เอนตัมไม่สามารถขยายชั้น (เฉพาะส่วนเชื่อมต่อแบบเฉพาะ) ดังนั้นมันจึงไม่เหมาะกับการใช้ทั้งหมด

รูปแบบการแยกเลขใน C++ และ C#

ใน C++ ซิงเกิลของเมเยอร์ ( (การเริ่มต้นแบบคงที่ภายใน) เป็นแบบวงกลม-ความปลอดภัยตั้งแต่ C+11 :

Singleton& getInstance() {
 static Singleton instance;
 return instance;
}

ใน C# คลาส จัดทําระบบเริ่มต้นแบบขี้เกียจแบบเสริมสร้างเนื้อผ้าแบบเสริมสร้าง:

public class Singleton {
 private static readonly Lazy<Singleton> _lazy =
 new Lazy<Singleton>(() => new Singleton());

 public static Singleton Instance => _lazy.Value;
}

การ ทดสอบ และ การ พิจารณา ใน โครงการ ทาง วิศวกรรม

ในโปรแกรมวิศวกรรม แบบซิงเกิลตันมักจะจัดการทรัพยากรร่วมกัน เช่น ไดรเวอร์ฮาร์ดแวร์, การตั้งค่า, สระว่ายน้ํา, หรือบริการทําไม้

  • [FLT: 0] ทําซิงเกิลที่ทดสอบได้ โดยจัดทําวิธีตั้งค่า (เช่น ป้องกัน [FLT: 28] วิธีที่ใช้เฉพาะในการทดสอบ หรือด้วยการฉีดสารอุดตันผ่านอินเทอร์เฟซผ่านอินเทอร์เฟซ โปรแกรมสมัยใหม่จํานวนมากหลีกเลี่ยงการใช้ซิงเกิลในการจัดระบบการฉีดสารที่ควบคุมการฉีดซึ่งควบคุมการดูดซึมของอวัยวะอื่น ๆ
  • [FLT: 0]. การวิเคราะห์ Perphatance ในระบบเรียลไทม์หรือความถี่สูง (CLT:30) (C+++) อาจถูกต้องตามหลักแล้ว
  • [FLT: 0] ระบบที่ถูกตัด (FLT: 1) เรียกค่าตัวซิงเกิลให้มีลักษณะเฉพาะต่อโพรเซส ไม่ใช่โดยผ่านกระบวนการ ถ้าคุณต้องการซิงเกิลแบบกลุ่ม-อังกฤษ ให้ใช้ระบบประสานงานภายนอก (เช่น ฐานข้อมูล, สวนสัตว์ server หรือผู้นํา)
  • [FLT: 0] การย้อนรอยและการต่อเนื่อง สามารถทําลายซิงเกิลได้ ใช้ ในจาวาซีรีส์ และป้องกันการสะท้อนการกระตุ้นด้วยการโยนข้อยกเว้นในก่อสร้างหาก ได้ตั้งค่าแล้ว

รูปแบบการวน

รูปแบบการซิงเกิลยังคงเป็นเครื่องมือที่มีค่าในกล่องเครื่องมือของซอฟต์แวร์ แต่การทํางานในสภาพแวดล้อมหลายแบบที่ต้องการการเรียกดูอย่างรัดกุม โดยความเข้าใจและหลีกเลี่ยงความผิดพลาดทั่วไป -- เช่น การสร้างแบบไม่แสวงหาคุณภาพ, การปรับเทียบข้อมูล, การใช้การใช้งานที่ไม่เหมาะสม, การใช้สารกระตุ้นที่ไม่เหมาะสม, และการใช้สารกระตุ้นที่มีประสิทธิภาพมากเกินไป รูปแบบการยึดแบบคู่แบบคงที่, การจับสัญญาณแบบคงที่ และวางตําแหน่งบนแผ่นไม้นอนบนแผ่นไม้นอน

สําหรับ การ ศึกษา เพิ่ม เติม โปรด อ้าง ถึง แหล่ง ข้อมูล ต่อ ไป นี้:

  • [FLT: 0] Wikipedia: ซิงเกิลตัน รูปแบบของ
  • [FLT: 0] Orcult Java ซิงเกิลตัน ทูอาล็อก
  • [FLT: 0] ] "ล็อคล็อกแบบดับเบิลถูกรื้อถอน" ปฏิญญา
  • [FLT: 0]. Microsoft.NET ซิงเกิลตัน รูปแบบของ

ใน ที่ สุด การ ใช้ ซิงเกิล ตัน อย่าง ดี ที่ สุด ก็ เป็น วิธี ที่ ง่าย ที่ สุด สําหรับ ข้อ เรียก ร้อง ของ คุณ.