ในหนังสือของ Dr. Yan Hong "Java and Mode" มันเริ่มต้นด้วยคำอธิบายของโหมด Flyweight:
Flyweight หมายถึงระดับน้ำหนักที่เบาที่สุดนั่นคือ "Flyweight" หรือ "ระดับฝน" การแปลของ "โหมด Xienyuan" ถูกเลือกที่นี่เพราะสิ่งนี้สามารถสะท้อนความตั้งใจของโหมดได้ดีขึ้น รูปแบบสารานุกรมเป็นรูปแบบโครงสร้างของวัตถุ โหมดสารานุกรมรองรับวัตถุที่มีเนื้อละเอียดจำนวนมากอย่างมีประสิทธิภาพในวิธีที่ใช้ร่วมกัน
ประเภทสตริงใน Java
ในภาษา Java ประเภทสตริงใช้โหมดสารานุกรม วัตถุสตริงเป็นประเภทสุดท้ายและไม่สามารถเปลี่ยนแปลงได้เมื่อสร้างขึ้น ใน Java ค่าคงที่สตริงมีอยู่ในสระคงที่ Java จะตรวจสอบให้แน่ใจว่าค่าคงที่สตริงมีเพียงหนึ่งสำเนาในพูลคงที่ String A = "ABC" โดยที่ "ABC" เป็นค่าคงที่สตริง
การทดสอบระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {string a = "abc"; สตริง b = "abc"; System.out.println (a == b); -ผลลัพธ์ในตัวอย่างข้างต้นเป็นจริงซึ่งหมายความว่าทั้ง A และ B อ้างถึงค่าคงที่สตริงเดียวกัน "ABC" ในสระคงที่ การออกแบบดังกล่าวหลีกเลี่ยงการใช้ทรัพยากรจำนวนมากที่ไม่จำเป็นซึ่งสร้างขึ้นเมื่อสร้างวัตถุที่เหมือนกัน N หรือมากกว่า
โครงสร้างของรูปแบบความเพลิดเพลิน
รูปแบบสนุกใช้การแบ่งปันเพื่อหลีกเลี่ยงค่าใช้จ่ายในการมีวัตถุเนื้อหาเดียวกัน สิ่งที่พบบ่อยและใช้งานง่ายเกี่ยวกับค่าใช้จ่ายนี้คือการสูญเสียความจำ กุญแจสำคัญในการแบ่งปันวัตถุสารานุกรมคือการแยกแยะความแตกต่าง ระหว่างสถานะภายใน และ สถานะภายนอก
สถานะที่แท้จริงจะถูกเก็บไว้ในวัตถุเซียงกีแวนและจะไม่แตกต่างกันไปตามสภาพแวดล้อม ดังนั้นองค์ประกอบการเสียสละสามารถมีสถานะที่แท้จริงและสามารถแบ่งปันได้
สถานะภายนอกเปลี่ยนแปลงไปกับการเปลี่ยนแปลงของสภาพแวดล้อมและไม่สามารถใช้ร่วมกันได้ สถานะภายนอกของวัตถุ Xiangyuan จะต้องได้รับการบันทึกโดยลูกค้าและหลังจากสร้างวัตถุ Xiangyuan มันจะถูกส่งผ่านเข้าไปในวัตถุ Xiangyuan เมื่อจำเป็นต้องใช้ สถานะภายนอกไม่สามารถส่งผลกระทบต่อสถานะภายในของวัตถุที่มีชีวิตพวกเขาเป็นอิสระจากกัน
โหมดความเพลิดเพลินสามารถแบ่งออกเป็นสองรูปแบบ: โหมดสนุกแวนและคอมโพสิตเพลิดเพลินกับโหมดหยวน
โหมดความบันเทิงที่เรียบง่าย
ในโหมดที่ยังหลงเหลืออยู่อย่างง่ายวัตถุที่ยังหลงเหลืออยู่ทั้งหมดสามารถแชร์ได้
บทบาทที่เกี่ยวข้องในโหมดความเพลิดเพลินอย่างง่ายมีดังนี้:
บทคัดย่อบท Flyweight: ให้อินเทอร์เฟซนามธรรมเพื่อระบุวิธีการที่บทบาทของฟลายเวทเฉพาะทั้งหมดจำเป็นต้องดำเนินการ
บทบาท Concreteflyweight: ใช้อินเทอร์เฟซที่ระบุโดยบทบาท Xiangyuan นามธรรม หากมีสถานะที่แท้จริงคุณจะต้องรับผิดชอบในการจัดหาพื้นที่เก็บข้อมูลสำหรับสถานะที่แท้จริง
บทบาทของ FlyweightFactory: บทบาทนี้มีหน้าที่รับผิดชอบในการสร้างและจัดการบทบาทเซียงกี บทบาทนี้จะต้องตรวจสอบให้แน่ใจว่าระบบความบันเทิงสามารถแบ่งปันได้อย่างเหมาะสมโดยระบบ เมื่อลูกค้าวัตถุเรียกวัตถุ Xiangyuan บทบาทโรงงาน Xiangyuan จะตรวจสอบว่ามีวัตถุ Xiangyuan อยู่แล้วที่ตรงตามข้อกำหนดในระบบหรือไม่ หากมีอยู่แล้วบทบาทโรงงาน Xiangyuan ควรจัดหาวัตถุ Xiangyuan ที่มีอยู่ หากไม่มีวัตถุ Xiangyuan ที่เหมาะสมในระบบบทบาทโรงงาน Xiangyuan ควรสร้างวัตถุ Xiangyuan ที่เหมาะสม
รหัสต้นฉบับ
คลาสอักขระนามธรรม
อินเทอร์เฟซสาธารณะฟลายเวท {// วิธีแผนผังสถานะพารามิเตอร์คือการดำเนินการโมฆะสถานะภายนอก (สถานะสตริง);}ตัวละครสารานุกรมเฉพาะคอนกรีตฟิลเวทเวทมีสถานะที่แท้จริง ในตัวอย่างนี้คุณสมบัติของรัฐที่แท้จริงของประเภทอักขระแสดงถึงและควรกำหนดค่าของมันเมื่อสร้างวัตถุสารานุกรม สถานะที่แท้จริงทั้งหมดจะไม่เปลี่ยนแปลงหลังจากสร้างวัตถุ
หากวัตถุเสียสละมีสถานะภายนอกสถานะภายนอกทั้งหมดจะต้องเก็บไว้ในลูกค้า เมื่อใช้วัตถุเสียสละวัตถุเสียสละจะถูกส่งผ่านไปยังวัตถุเสียสละโดยลูกค้า มีสถานะภายนอกเพียงสถานะเดียวที่นี่และสถานะพารามิเตอร์ของวิธีการดำเนินการ () คือสถานะภายนอกที่ส่งผ่านจากภายนอก
คลาสสาธารณะ Concreteflyweight ใช้ฟลายเวท {ตัวละครส่วนตัว IntrinsicState = null; / *** Constructor สถานะที่แท้จริงจะถูกส่งผ่านเป็นพารามิเตอร์* @param State*/ Public Concreteflyweight (สถานะตัวละคร) {this.intrinsicstate = state; } /** * สถานะภายนอกถูกส่งผ่านเป็นพารามิเตอร์ในวิธีการเปลี่ยนพฤติกรรมของวิธีการ * แต่ไม่เปลี่ยนสถานะที่แท้จริงของวัตถุ */ @Override การดำเนินงานโมฆะสาธารณะ (สถานะสตริง) {// todo วิธีการที่สร้างขึ้นอัตโนมัติระบบ Stub System.out.println ("สถานะ intrinsic =" + this.intrinsicstate); System.out.println ("สถานะ extrinsic =" + สถานะ); -สำหรับคลาสบทบาทโรงงาน Xiangyuan จะต้องชี้ให้เห็นว่าลูกค้าไม่สามารถยกตัวอย่างคลาส Xiangyuan ที่เฉพาะเจาะจงโดยตรง แต่ต้องใช้วิธีโรงงาน () เพื่อรับวัตถุ Xiangyuan โดยทั่วไปการพูดมีวัตถุโรงงานเซียงกีเพียงหนึ่งเดียวในระบบทั้งหมดดังนั้นจึงสามารถใช้โหมดซิงเกิลตันได้
เมื่อลูกค้าต้องการวัตถุความบันเทิงที่เรียบง่ายมันจำเป็นต้องเรียกใช้วิธีการของโรงงาน () ของโรงงานสนุกและส่งผ่านในสถานะภายในที่จำเป็นของโรงงานสนุกและวิธีการโรงงานสร้างวัตถุเพลิดเพลินที่จำเป็น
Public Class FlyweightFactory {แผนที่ส่วนตัว <อักขระ, flyweight> files = new hashmap <อักขระ, flyweight> (); โรงงานฟลายเวทสาธารณะ (สถานะอักขระ) {// ก่อนมองหาวัตถุจากแคช Flyweight Fly = files.get (สถานะ); if (fly == null) {// ถ้าวัตถุไม่มีอยู่ให้สร้างวัตถุ Flyweight Fly = ใหม่ ConcreteFlyweight (สถานะ); // เพิ่มวัตถุฟลายเวทใหม่นี้ลงในไฟล์แคช. บัท (สถานะ, บิน); } return fly; -ชั้นเรียนไคลเอนต์
ไคลเอนต์ระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// วิธีการที่สร้างอัตโนมัติแบบอัตโนมัติ Stub FlyweightFactory Factory = New FlyweightFactory (); Flyweight Fly = Factory.Factory (ตัวละครใหม่ ('A')); fly.operation ("โทรครั้งแรก"); Fly = Factory.Factory (ตัวละครใหม่ ('B')); fly.operation ("สายที่สอง"); Fly = Factory.Factory (ตัวละครใหม่ ('A')); fly.operation ("การโทรครั้งที่สาม"); -แม้ว่าลูกค้าที่ใช้สำหรับวัตถุเสียสละสามชิ้น แต่มีเพียงสองวัตถุที่สร้างขึ้นจริงซึ่งเป็นสิ่งที่หมายถึงการแบ่งปัน ผลการดำเนินการมีดังนี้:
โหมดความบันเทิงที่ซับซ้อน
ในโหมดความบันเทิงที่เรียบง่ายวัตถุความเพลิดเพลินทั้งหมดเป็นวัตถุความบันเทิงที่เรียบง่ายซึ่งหมายความว่าพวกเขาสามารถแชร์ได้โดยตรง นอกจากนี้ยังมีสถานการณ์ที่ซับซ้อนมากขึ้นซึ่งโหมดการสังเคราะห์การใช้งานภายนอกอย่างง่าย ๆ รวมกันเข้าด้วยกันเพื่อสร้างวัตถุภายนอกคอมโพสิต วัตถุเมตาผสมคอมโพสิตดังกล่าวไม่สามารถแบ่งปันได้ด้วยตัวเอง แต่พวกเขาสามารถแบ่งออกเป็นวัตถุ Meta-Enjoy ที่เรียบง่ายและสามารถแบ่งปันได้
ตัวละครที่เกี่ยวข้องกับตัวละครในสารประกอบ Xiangyuan มีดังนี้:
บทคัดย่อบท Flyweight: ให้อินเทอร์เฟซนามธรรมเพื่อระบุวิธีการที่บทบาทของฟลายเวทเฉพาะทั้งหมดจำเป็นต้องดำเนินการ
บทบาท Concreteflyweight: ใช้อินเทอร์เฟซที่ระบุโดยบทบาท Xiangyuan นามธรรม หากมีสถานะที่แท้จริงคุณจะต้องรับผิดชอบในการจัดหาพื้นที่เก็บข้อมูลสำหรับสถานะที่แท้จริง
CompositeCompositeflyweight บทบาท: วัตถุที่แสดงโดยส่วนแบ่งสารประกอบไม่สามารถแบ่งปันได้ แต่วัตถุคอมโพสิตแบ่งปันสามารถย่อยสลายเป็นหลายชุดของวัตถุที่เป็นเพียงการแบ่งปันวัตถุ บทบาทของสารประกอบภายนอกนั้นเรียกว่าวัตถุภายนอกที่ไม่ได้แชร์
บทบาทของ FlyweightFactory: บทบาทนี้มีหน้าที่รับผิดชอบในการสร้างและจัดการบทบาทเซียงกี บทบาทนี้จะต้องตรวจสอบให้แน่ใจว่าระบบความบันเทิงสามารถแบ่งปันได้อย่างเหมาะสมโดยระบบ เมื่อลูกค้าวัตถุเรียกวัตถุ Xiangyuan บทบาทโรงงาน Xiangyuan จะตรวจสอบว่ามีวัตถุ Xiangyuan อยู่แล้วที่ตรงตามข้อกำหนดในระบบหรือไม่ หากมีอยู่แล้วบทบาทโรงงาน Xiangyuan ควรจัดหาวัตถุ Xiangyuan ที่มีอยู่ หากไม่มีวัตถุ Xiangyuan ที่เหมาะสมในระบบบทบาทโรงงาน Xiangyuan ควรสร้างวัตถุ Xiangyuan ที่เหมาะสม
รหัสต้นฉบับ
คลาสอักขระนามธรรม
อินเทอร์เฟซสาธารณะฟลายเวท {// วิธีแผนผังสถานะพารามิเตอร์คือการดำเนินการโมฆะสถานะภายนอก (สถานะสตริง);} คลาสบทบาทความเพลิดเพลินเฉพาะ
คลาสสาธารณะ Concreteflyweight ใช้ฟลายเวท {ตัวละครส่วนตัว IntrinsicState = null; / *** Constructor สถานะที่แท้จริงจะถูกส่งผ่านเป็นพารามิเตอร์* @param State*/ Public Concreteflyweight (สถานะตัวละคร) {this.intrinsicstate = state; } /** * สถานะภายนอกถูกส่งผ่านเป็นพารามิเตอร์ในวิธีการเปลี่ยนพฤติกรรมของวิธีการ * แต่ไม่เปลี่ยนสถานะที่แท้จริงของวัตถุ */ @Override การดำเนินงานโมฆะสาธารณะ (สถานะสตริง) {// todo วิธีการที่สร้างขึ้นอัตโนมัติระบบ Stub System.out.println ("สถานะ intrinsic =" + this.intrinsicstate); System.out.println ("สถานะ extrinsic =" + สถานะ); -วัตถุภายนอกคอมโพสิตประกอบด้วยวัตถุภายนอกบริสุทธิ์ผ่านการผสมดังนั้นจึงมีวิธีการจัดการการรวมเช่น ADD () เนื่องจากวัตถุเมตาคอมโพสิตมีองค์ประกอบรวมที่แตกต่างกันองค์ประกอบรวมเหล่านี้จะถูกเพิ่มหลังจากวัตถุเมตาคอมโพสิตถูกสร้างขึ้นสิ่งนี้หมายความว่าสถานะของวัตถุเมตาคอมโพสิตจะเปลี่ยนไปดังนั้นวัตถุเมตาคอมโพสิตจึงไม่สามารถแชร์ได้
บทบาท extrinsic สารประกอบใช้อินเทอร์เฟซที่ระบุโดยบทบาทภายนอกที่เป็นนามธรรมนั่นคือวิธีการดำเนินการ () วิธีนี้มีพารามิเตอร์ที่แสดงถึงสถานะภายนอกของวัตถุ extrinsic คอมโพสิต สถานะภายนอกขององค์ประกอบทั้งหมดของวัตถุความบันเทิงคอมโพสิตเท่ากับสถานะภายนอกของวัตถุความบันเทิงคอมโพสิต; ในขณะที่สถานะภายในของวัตถุความบันเทิงอย่างง่ายที่มีอยู่ในวัตถุความบันเทิงคอมโพสิตโดยทั่วไปจะไม่เท่ากันมิฉะนั้นจะไม่มีค่าใช้งาน
คลาสสาธารณะ ConcretecompositeFlyweight ใช้ฟลายเวท {แผนที่ส่วนตัว <อักขระ, flyweight> files = new hashmap <อักขระ, flyweight> (); / *** เพิ่มวัตถุ meta-saving แบบง่ายใหม่ลงในคลัสเตอร์*/ โมฆะสาธารณะเพิ่ม (คีย์อักขระ, Flyweight Fly) {files.put (คีย์, บิน); } / *** สถานะภายนอกถูกส่งผ่านไปยังวิธีการเป็นพารามิเตอร์* / @Override การดำเนินการสาธารณะสาธารณะ (สถานะสตริง) {flyweight fly = null; สำหรับ (Object O: files.keyset ()) {fly = files.get (o); fly.Operation (รัฐ); - บทบาทโรงงาน Xiangyuan มีสองวิธีที่แตกต่างกันหนึ่งวิธีสำหรับการจัดหาวัตถุ Xiangyuan อย่างง่ายและอีกวิธีหนึ่งสำหรับการจัดหาวัตถุ Xiangyuan คอมโพสิต
Public Class FlyweightFactory {แผนที่ส่วนตัว <อักขระ, flyweight> files = new hashmap <อักขระ, flyweight> (); / *** ผสมวิธีการโรงงาน Xiangyuan*/ โรงงานฟลายเวทสาธารณะ (รายการ <caricy> compositestate) {ConcretecompositeFlyweight CompositeFly = concretecompositeFlyweight (); สำหรับ (สถานะอักขระ: compositestate) {compositefly.add (state, this.factory (state)); } return CompositeFly; } /*** วิธีการโรงงานสารานุกรมสารานุกรม* /โรงงานฟลายเวทสาธารณะ (สถานะอักขระ) {// ก่อนมองหาวัตถุจากแคช Flyweight Fly = files.get (สถานะ); if (fly == null) {// ถ้าวัตถุไม่มีอยู่ให้สร้างวัตถุ Flyweight Fly = ใหม่ ConcreteFlyweight (สถานะ); // เพิ่มวัตถุฟลายเวทใหม่นี้ลงในไฟล์แคช. บัท (สถานะ, บิน); } return fly; - บทบาทของลูกค้า
ไคลเอนต์คลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {รายการ <caricy> compoSitestate = new ArrayList <caricy> (); compositestate.add ('a'); compositestate.add ('b'); compositestate.add ('c'); compositestate.add ('a'); compositestate.add ('b'); flyweightfactory flyfactory = ใหม่ flyweightfactory (); Flyweight CompositeFly1 = flyfactory.factory (compositestate); Flyweight CompositeFly2 = flyfactory.factory (compositestate); CompositeFly1.Operation ("Composite Call"); System.out.println ("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - flyfactory.factory (state);ผลการดำเนินการมีดังนี้:
จากผลการดำเนินงานจะเห็นได้ว่าสถานะภายนอกขององค์ประกอบทั้งหมดของวัตถุความบันเทิงคอมโพสิตเท่ากับสถานะภายนอกของวัตถุความเพลิดเพลินคอมโพสิต นั่นคือสถานะฟอร์จูนภายนอกเท่ากับการโทรคอมโพสิต
จากผลการดำเนินการจะเห็นได้ว่าสถานะความหมายแฝงของวัตถุที่ยังหลงเหลืออยู่ที่มีอยู่ในวัตถุที่ยังหลงเหลืออยู่โดยทั่วไปนั้นไม่เท่ากัน นั่นคือสถานะภายในคือ B, C และ A
จากผลการดำเนินงานจะเห็นได้ว่าไม่สามารถแชร์วัตถุคอมโพสิตแบ่งปันได้ นั่นคือวัตถุที่สร้างขึ้นโดยใช้การคอมโพสิตวัตถุเดียวกันผ่านโรงงานสองครั้งไม่ใช่วัตถุเดียวกัน
จากผลการดำเนินการจะเห็นได้ว่าเพียงแค่เพลิดเพลินกับองค์ประกอบสามารถแบ่งปันได้ นั่นคือวัตถุที่สร้างผ่านโรงงานสองครั้งโดยใช้สถานะวัตถุเดียวกันเป็นวัตถุเดียวกัน
ข้อดีและข้อเสียของโมเดล Xiangyuan
ข้อได้เปรียบของโหมดสารานุกรมคือมันช่วยลดจำนวนวัตถุในหน่วยความจำได้อย่างมาก อย่างไรก็ตามราคาที่จ่ายให้ทำเช่นนี้ก็สูงมากเช่นกัน:
โหมดสารานุกรมทำให้ระบบมีความซับซ้อนมากขึ้น เพื่อให้วัตถุถูกแชร์รัฐบางรัฐจำเป็นต้องได้รับการส่งภายนอกซึ่งทำให้ตรรกะของโปรแกรมมีความซับซ้อน
โหมดสนุกจะทำให้สถานะของวัตถุเพลิดเพลินอยู่นอกโลกในขณะที่การอ่านสถานะภายนอกทำให้เวลาทำงานนานขึ้นเล็กน้อย
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น