โหมดฟลายเวท: ผ่านเทคโนโลยีการแชร์มันสามารถรองรับวัตถุที่มีเนื้อละเอียดจำนวนมากได้อย่างมีประสิทธิภาพ
โหมดความเพลิดเพลินในโหมดหยวนแบ่งออกเป็นโหมดแวนแวนและคอมโพสิตเพลิดเพลินไปกับโหมดหยวนใน "Java and Mode" ของ Yan Hong คอมโพสิตเพลิดเพลินกับหยวนในโหมดคอมโพสิตไม่สามารถแชร์ได้ กุญแจสำคัญในการแบ่งปันความสนุกของวัตถุหยวนคือการแยกแยะความแตกต่างระหว่างสถานะภายในและภายนอก "ความสัมพันธ์" ทั้งสองนี้ยากเกินไปที่จะเข้าใจ ฉันไม่ได้บอกว่าการแปลไม่ดี แต่บางทีความสามารถในการทำความเข้าใจของฉันอาจไม่ดีหรือเวอร์ชันการแปลของ "องค์ประกอบรูปแบบการออกแบบของซอฟต์แวร์เชิงวัตถุที่นำกลับมาใช้ใหม่ได้" ถูกแปลเป็นวัตถุภายในและภายนอก มันค่อนข้างตรงไปตรงมาและรู้สึกอึดอัดใจต่อกลิ่นวรรณกรรมของสิ่งที่มีแนวคิดที่แข็งแกร่งเกินไป ตัวละครที่นี่ยังใช้คำสั่ง "พื้นฐานของรูปแบบการออกแบบซอฟต์แวร์เชิงวัตถุที่นำกลับมาใช้ใหม่ได้" ซึ่งไม่ได้แยกความแตกต่างระหว่างโหมดง่าย ๆ และโหมดคอมโพสิต แต่มี unsharedconcreteflyweight (ใน "Java and Mode" มันบ่งชี้ว่าไม่สามารถแบ่งปันความเพลิดเพลินแบบคอมโพสิต) เราที่นี่บอกว่ามันไม่สามารถแบ่งปันบทบาทความเพลิดเพลิน ด้วยวิธีนี้ตัวละครในโหมดความบันเทิงรวมถึง:
แผนภาพสถาบันของคลาสของโมเดล Xiangyuan มีดังนี้:
เมื่อใช้รูปแบบสารานุกรมใน Java.lang.String Design เรารู้ว่าสตริงใน Java จะถูกแชร์เสมอเช่นตัวอย่างโค้ดต่อไปนี้:
สตริง m = "a"; สตริง n = "a"; system.out.println (m == n);
สิ่งนี้จะส่งออกจริงแสดงว่า M และ N ชี้ไปที่อินสแตนซ์เดียวกันและมีเพียงหนึ่ง "A" ในหน่วยความจำ นี่คือวิธีการใช้โหมดความสนุกที่ใช้กับสตริง
การใช้โหมด Xiangyuan ในกระบวนการแก้ไขข้อความและการจัดเก็บ ที่นี่สันนิษฐานว่าบทความประกอบด้วยวัตถุบรรทัดและวัตถุบรรทัดประกอบด้วยวัตถุอักขระหลายตัว อย่างไรก็ตามหากตัวละครแต่ละตัวบันทึกวัตถุของตัวเองโพสต์มีวัตถุตัวละครหลายพันตัวซึ่งใช้หน่วยความจำระบบอย่างจริงจังและทำให้เกิดการใช้งานรันไทม์ที่ยอมรับไม่ได้ วิธีที่ดีคือการใช้โหมด Xiangyuan เพื่อบันทึกค่าการเข้ารหัสอักขระ ASCII เท่านั้นในฐานะสถานะที่ไม่เปลี่ยนแปลงภายในแบ่งปันวัตถุอักขระและข้อมูลที่จัดรูปแบบเช่นสีและขนาดอักขระสัมพัทธ์จะถูกเก็บรักษาโดยลูกค้าและสามารถส่งผ่านจากภายนอกในระหว่างการรันไทม์ แต่ละแถวเป็นวัตถุสากลที่ไม่แชร์ซึ่งประกอบด้วยวัตถุสากล (วัตถุอักขระ)
ลองมาดูตัวอย่างโครงสร้างที่เรียบง่ายของรูปแบบสารานุกรม:
/ *** ตัวอักษร*/ จดหมายเรียนสาธารณะ {ชื่อสตริงส่วนตัว; จดหมายสาธารณะ (ชื่อสตริง) {this.name = name; } สตริงสาธารณะ getName () {ชื่อคืน; - / ** * โรงงาน Xiangyuan (โรงงานซิงเกิลตัน) ที่สร้างวัตถุตัวอักษร */ คลาสสาธารณะ LetterFactory {แผนที่ส่วนตัว <สตริง, ตัวอักษร> แผนที่; อินสแตนซ์ LetterFactory แบบคงที่ส่วนตัว = new LetterFactory (); Private LetterFactory () {map = new hashmap <string, letter> (); } public Static LetterFactory getInstance () {return instance; } โมฆะสาธารณะเพิ่ม (ตัวอักษรตัวอักษร) {ถ้า (ตัวอักษร! = null &&! map.containskey (letter.getName ())) {map.put (letter.getName (), ตัวอักษร); } system.out.println ("map.size ====" + map.size ()); } ตัวอักษรสาธารณะรับ (ชื่อสตริง) {return map.get (ชื่อ); - การทดสอบระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (String [] args) {LetterFactory Factory = LetterFactory.getInstance (); String word = "ความสะดวก"; addletterbyname (โรงงาน, คำ); getletter (โรงงาน, คำ); } // เพิ่มตัวอักษรวัตถุโมฆะคงที่ addletterbyName (LetterFactory Factory, String word) {สำหรับ (Char C: Word.toChararray ()) {Factory.Add (ตัวอักษรใหม่ (C + "")); }} // เอาท์พุทตัวอักษรวัตถุโมฆะคงที่ getLetter (LetterFactory Factory, String word) {สำหรับ (Char C: Word.toChararray ()) {System.out.println (Factory.get (C + "")); -พิมพ์:
map.size ==== 1 map.size ==== 2 Map.size ==== 2 Map.size ===== 3 Map.size ==== 4 Map.size ==== 5 Map.size ==== 5 Flyweight.letter@3343C8B3 Flyweight@272d7a10 flyweight.letter@1aa8c488 flyweight.letter@3dfeca64 flyweight.letter@22998b08 flyweight.letter@1aa8c488