โหมดซิงเกิลตัน
แรงจูงใจบางครั้งมีความสำคัญที่จะมีเพียงตัวอย่างเดียวของชั้นเรียน ตัวอย่างเช่นระบบควรมีอินสแตนซ์การจัดการหน้าต่างเพียงครั้งเดียว
รูปแบบ Singleton เป็นรูปแบบการออกแบบที่ง่ายที่สุด: ชั้นเรียนมีหน้าที่ทำอินสแตนซ์ตัวเองเพื่อให้มั่นใจว่ามีเพียงอินสแตนซ์เดียวและให้รายการเพื่อเข้าถึงอินสแตนซ์นี้
วัตถุประสงค์
1. ตรวจสอบให้แน่ใจว่ามีเพียงอินสแตนซ์เดียวเท่านั้น
2. ให้รายการเพื่อเข้าถึงอินสแตนซ์นี้
ใช้ขั้นสุดท้ายเพื่อให้แน่ใจว่ามันถูกสร้างขึ้นเพียงครั้งเดียวและตัวสร้างส่วนตัวทำให้มั่นใจได้ว่ามันจะไม่ได้รับการสร้างอินสแตนซ์ วิธีการ getInstance ของสาธารณะทำให้มั่นใจได้ว่าการเข้าถึงภายนอกเป็นไปได้ ต่อไปนี้เป็นโหมดหิว:
Singleton คลาสสาธารณะ {อินสแตนซ์ Singleton สุดท้ายคงที่ = New Singleton (); Private Singleton () {} Public Static Singleton GetInstance () {อินสแตนซ์กลับ; -
โหมดขี้เกียจ:
Public Class Singletondemo {อินสแตนซ์ Singletondemo ที่มีความผันผวนแบบคงที่ส่วนตัว = NULL; Private Singletondemo () {} สาธารณะคงที่ Singletondemo getInstance () {ถ้า (อินสแตนซ์ == null) {ซิงโครไนซ์ (Singletondemo .class) {ถ้า (อินสแตนซ์ == null) {อินสแตนซ์ = ใหม่ singletondemo (); }} ส่งคืนอินสแตนซ์; -
สถานการณ์และตัวอย่างที่เกี่ยวข้อง
1. คลาส Logger ป้องกันการสร้างอินสแตนซ์ Logger ทุกครั้งที่บันทึกการพิมพ์
2. คลาสควบคุมโดยทั่วไปมีเพียงอินสแตนซ์ควบคุมเดียวในระบบทั้งหมด
ปัญหาและการใช้งานเฉพาะ
1. โหมดด้ายที่ปลอดภัยโหมดซิงเกิลที่แข็งแกร่งควรมีความปลอดภัยจากด้าย
2. โหมดขี้เกียจใช้กลไกการล็อคสองครั้ง
3. โหมด Eagle ใช้ตัวแปรคงที่และมีการสร้างอินสแตนซ์เมื่อโปรแกรมถูกโหลดเพื่อให้มั่นใจว่ามีเพียงอินสแตนซ์เดียวเท่านั้น
4. วิธีการที่เป็นนามธรรมจากโรงงานและวิธีการโรงงานได้รับการออกแบบเป็นรูปแบบซิงเกิลตันเพื่อให้แน่ใจว่ามีโรงงานเพียงแห่งเดียว
5. เมื่อใช้การทำให้เป็นอนุกรมและ deserialization จะมีการสร้างหลายกรณี ใช้ฟังก์ชั่น ReadResolve เพื่อหลีกเลี่ยงสิ่งนี้ แต่เป็นการดีที่สุดที่จะไม่ใช้การทำให้เป็นอนุกรม
Public Class Singleton ใช้ serializable {... // วิธีนี้เรียกว่าทันทีหลังจากวัตถุของคลาสนี้ถูก deserialized // วิธีนี้ส่งคืนอินสแตนซ์ซิงเกิล วัตถุที่ได้รับการป้องกัน readresolve () {return getInstance (); -
ประเด็นสำคัญ
1. ในโปรแกรมหลายเธรดให้ความสนใจกับการซิงโครไนซ์ข้อมูล
2. เมื่อเป็นอนุกรมให้ใช้วิธี readResolve เพื่อส่งคืนอินสแตนซ์เพื่อหลีกเลี่ยงวัตถุหลายชิ้นที่ถูกสร้างขึ้น
3. หากโหลดโดยตัวโหลดหลายคลาสจะมีการสร้างหลายอินสแตนซ์
โหมดโรงงานง่าย ๆ
รูปแบบการสร้างแรงจูงใจจากโรงงานอย่างง่ายคือพื้นฐานและการดำเนินการเบื้องต้นของวิธีการที่เป็นนามธรรมของโรงงานและวิธีการโรงงาน
วัตถุประสงค์
1. อย่าเปิดเผยรายละเอียดของการสร้างอินสแตนซ์ของวัตถุให้กับลูกค้า
2. สร้างวัตถุผ่านอินเทอร์เฟซทั่วไป
ทำให้สำเร็จ
การใช้งานนั้นง่ายมาก:
1. เมื่อลูกค้าต้องการผลิตภัณฑ์มันไม่ได้ใช้ใหม่เพื่อสร้าง แต่ให้คำอธิบายผลิตภัณฑ์แก่โรงงานทำให้โรงงานสามารถจัดหาผลิตภัณฑ์ใหม่ได้
2. โรงงานสร้างสรรค์ผลิตภัณฑ์ให้กับลูกค้า
3. ลูกค้าใช้ผลิตภัณฑ์นามธรรมโดยไม่ต้องดูแลเกี่ยวกับการใช้งานผลิตภัณฑ์ที่เป็นรูปธรรม
ตัวอย่าง
1. โปรแกรมวาดรูปสำหรับรูปร่างการวาด รูปร่างเป็นอินเทอร์เฟซผลิตภัณฑ์และสามเหลี่ยมเป็นผลิตภัณฑ์คอนกรีต เราสามารถสร้างโรงงานแล้วสร้างผลิตภัณฑ์ตามคำอธิบายของลูกค้า อย่างไรก็ตามเมื่อเพิ่มรูปร่างใหม่เราจำเป็นต้องปรับเปลี่ยนคลาสโรงงาน
ปัญหาและการใช้งานเฉพาะ
1. เมื่อเพิ่มผลิตภัณฑ์ใหม่โรงงานจะต้องได้รับการแก้ไข
คลาสสาธารณะ productFactory {ผลิตภัณฑ์สาธารณะ createProduct (String productId) {ถ้า (id == id1) ส่งคืน oneProduct ใหม่ (); ถ้า (id == id2) ส่งคืนใหม่ใหม่ (); ... // เป็นต้นไปสำหรับ ID อื่น ๆ ที่ส่งคืนโมฆะ; // ถ้า ID ไม่มีค่าที่คาดหวัง} ... }โดยทั่วไปเราใช้คำสั่ง IF เพื่อตัดสินคำอธิบายผลิตภัณฑ์และยกตัวอย่างผลิตภัณฑ์ที่แตกต่างกัน เมื่อมีผลิตภัณฑ์ใหม่เราต้องเพิ่มการตัดสินใหม่ ปัญหานี้สามารถแก้ไขได้โดยรูปแบบโรงงานนามธรรม
สรุป
1. ใช้มันเฉพาะเมื่อคุณต้องการโหมดโรงงานจริงๆมิฉะนั้นมันจะเพิ่มความซับซ้อนของโปรแกรม ตัวอย่างเช่นเมื่อวัตถุหลายชิ้นมีประเภทพื้นฐานที่คล้ายกันคุณสามารถพิจารณาใช้โหมดโรงงานอย่างง่ายเพื่อสร้างวัตถุอย่างสม่ำเสมอ
2. โรงงานง่าย ๆ มีคำสั่งสาขาการตัดสินมากขึ้นซึ่งละเมิดหลักการของการเปิดและปิดการดัดแปลง ดังนั้นจึงควรใช้โหมดโรงงานอย่างง่ายสำหรับโปรแกรมที่ได้รับการแก้ไขและเรียบง่ายและใช้โหมด Abstract Factory หรือโหมด Method Method สำหรับโปรแกรมที่ซับซ้อนและขยายบ่อยครั้ง