ฟลายเวท
รุ่นฟลายเวท (ฟลายเวทรูปแบบ) ส่วนใหญ่จะใช้เพื่อลดจำนวนของวัตถุที่สร้างขึ้นเพื่อลดการใช้หน่วยความจำและการปรับปรุงประสิทธิภาพการทำงาน ประเภทของรูปแบบการออกแบบเป็นรูปแบบโครงสร้างซึ่งมีการลดจำนวนของวัตถุในการปรับปรุงโครงสร้างของวัตถุในลักษณะที่ต้องการโดยการประยุกต์ใช้
ฟลายเวทพยายามที่จะนำมาใช้วัตถุที่มีอยู่ของเดียวกันถ้าวัตถุที่ตรงกันไม่พบวัตถุใหม่จะถูกสร้างขึ้น เราจะวาด 20 วงกลมกระจายอยู่ในสถานที่ที่แตกต่างกันโดยการสร้างห้าวัตถุที่จะแสดงให้เห็นถึงรูปแบบนี้ตั้งแต่เพียงห้าชนิดของสีที่มีอยู่เพื่อให้แอตทริบิวต์สีที่ใช้ในการตรวจสอบวัตถุแวดวงที่มีอยู่
การแนะนำ
เจตนา: ใช้ร่วมกันให้การสนับสนุนจำนวนมากของวัตถุที่ละเอียด
เป็นหลักในการแก้ปัญหา: ในจำนวนมากของวัตถุก็อาจทำให้หน่วยความจำล้นเราใส่กันเป็นส่วนหนึ่งในนั้นเป็นนามธรรมถ้าคุณมีการร้องขอบริการเดียวกันโดยตรงกลับวัตถุที่มีอยู่ในหน่วยความจำเพื่อหลีกเลี่ยงการสร้างขึ้นใหม่
เมื่อใช้: 1 ระบบมีจำนวนมากของวัตถุ2 วัตถุเหล่านี้ใช้จำนวนมากของหน่วยความจำ 3 รัฐของที่สุดของวัตถุเหล่านี้สามารถนำมาภายนอก 4 เป็นจำนวนมากของวัตถุเหล่านี้สามารถแบ่งออกเป็นกลุ่มตามสถานะที่แท้จริงเมื่อวัตถุถูกลบออกจากวัตถุ Yun นอกแต่ละวัตถุที่สามารถตั้งค่าการใช้วัตถุแทน 5 ระบบไม่ได้ขึ้นอยู่กับตัวตนของวัตถุเหล่านี้วัตถุเหล่านี้จะแยกไม่ออก
วิธีการแก้ไข: การวิเคราะห์ที่มีรหัสประจำตัวที่ไม่ซ้ำกันถ้ามีอยู่ในหน่วยความจำรหัสประจำตัวที่ไม่ซ้ำกันของวัตถุที่ระบุจะถูกส่งกลับ
รหัสสำคัญ: HashMap เก็บไว้กับวัตถุเหล่านี้
ตัวอย่างการใช้งาน: 1, JAVA ในสตริงถ้ามันกลับมาถ้าไม่ได้แล้วสร้างสตริงเก็บไว้ในสระว่ายน้ำสตริงบัฟเฟอร์ภายใน2, ฐานข้อมูลข้อมูลที่สระว่ายน้ำ
ข้อดี: ลดการสร้างวัตถุลดหน่วยความจำของระบบเพื่อให้มีประสิทธิภาพดีขึ้น
ข้อเสีย: การเพิ่มขึ้นของค่าใช้จ่ายในระบบเราต้องแยกสถานะรัฐภายในและภายนอกและรัฐภายนอกของธรรมชาติเป็นอย่างโดยเนื้อแท้ไม่ควรเปลี่ยนกับรัฐภายในของการเปลี่ยนแปลงเป็นอย่างอื่นก็จะสร้างระบบความวุ่นวาย
สถานการณ์การใช้งาน: 1, ระบบที่มีจำนวนมากของวัตถุที่คล้ายกัน2 ต้องสระว่ายน้ำที่เกิดเหตุ
หมายเหตุ: 1 ให้ความสนใจกับสถานะของส่วนภายนอกและภายในของรัฐหรืออาจก่อให้เกิดปัญหาด้านความปลอดภัยของด้าย2 ชั้นต้องมีวัตถุโรงงานที่จะควบคุม
การสำนึก
เราจะสร้างอินเตอร์เฟซที่รูปร่างและการดำเนินงานของนิติบุคคลเรียนอินเตอร์เฟซรูปทรงวงกลมขั้นตอนต่อไปคือการกำหนดระดับชั้นโรงงานShapeFactory
ShapeFactoryมีวงกลมHashMap ที่สำคัญสีวงกลมชื่อวัตถุเมื่อใดก็ตามที่ได้รับการร้องขอก็จะสร้างวงกลมสีที่เฉพาะเจาะจงShapeFactoryตรวจสอบHashMapในวัตถุวงกลมหากพบวัตถุวงกลมวัตถุที่ถูกส่งกลับมิฉะนั้นมันจะสร้างที่เก็บไว้ใน HashMap เพื่อเตรียมความพร้อมสำหรับการใช้งานที่ตามมาของวัตถุใหม่และวัตถุที่จะถูกส่งกลับไปยังลูกค้า
FlyWeightPatternDemo สาธิตของเราที่จะได้รับการเรียนการใช้วัตถุรูปร่างShapeFactory มันจะส่งข้อมูล(แดง / สีเขียว / สีฟ้า / สีดำ/ สีขาว) เพื่อShapeFactory ก็ต้องเพื่อให้ได้สีของวัตถุ
ขั้นตอนที่ 1
สร้างอินเตอร์เฟซ
Shape.java
รูปร่างอินเตอร์เฟซที่สาธารณะ { วาดเป็นโมฆะ (); }
ขั้นตอนที่ 2
สร้างคลาสนิติบุคคลที่ใช้อินเตอร์เฟซ
Circle.java
วงกลมเรียนสาธารณะดำเนินรูปร่าง { สี String เอกชน int ส่วนตัว x; Y int เอกชน รัศมี int เอกชน วงกลมสาธารณะ (สี String) { this.color = สี; } setX โมฆะสาธารณะ (int x) { this.x = x; } โมฆะสาธารณะ Sety (int y) { this.y y =; } โมฆะสาธารณะ setRadius (int รัศมี) { this.radius = รัศมี; } @Override วาดโมฆะสาธารณะ () { System.out.println ( "วงกลม: วาด () [สี:" + สี + "X" + X + "Y:" + Y + "รัศมี:" + รัศมี); } }
ขั้นตอนที่ 3
สร้างโรงงานเพื่อผลิตชั้นเรียนนิติบุคคลวัตถุที่อยู่บนพื้นฐานของข้อมูลที่ได้รับมา
ShapeFactory.java
นำเข้า java.util.HashMap; ShapeFactory คลาสที่สาธารณะ { ส่วนตัวคง HashMap สุดท้าย <String, รูปร่าง> circleMap = HashMap ใหม่ (); สาธารณะคงรูปร่าง getCircle (สี String) { วงกลม = (วงกลม) circleMap.get (สี); ถ้า (วงกลม == null) { วงกลม = แวดวงใหม่ (สี); circleMap.put (สีวงกลม); System.out.println ( "การสร้างวงกลมสี:" + สี); } กลับวงกลม; } }
ขั้นตอนที่ 4
ใช้โรงงานที่จะได้รับวัตถุนิติบุคคลของการเรียนโดยการส่งผ่านข้อมูลสี
FlyweightPatternDemo.java
เรียนสาธารณะ FlyweightPatternDemo { ส่วนตัวคงสี String สุดท้าย [] = { "สีแดง" "กรีน", "สีฟ้า", "สีขาว", "สีดำ"}; ประชาชนเป็นโมฆะคง main (String args []) { for (int i = 0; i <20; ++ i) { วงกลม = (วงกลม) ShapeFactory.getCircle (getRandomColor ()); circle.setX (getRandomX ()); circle.setY (getRandomY ()); circle.setRadius (100); circle.draw (); } } ส่วนตัวคงที่ String getRandomColor () { กลับสี [(int) (Math.random () * colors.length)]; } ส่วนตัวคง int getRandomX () { ผลตอบแทน (int) (Math.random () * 100); } ส่วนตัวคง int getRandomY () { ผลตอบแทน (int) (Math.random () * 100); } }
ขั้นตอนที่ 5
ตรวจสอบการส่งออก
การสร้างวงกลมของสี: สีดำ วงกลม: วาด () [สีดำ, x: 36, Y: 71, รัศมี: 100 การสร้างวงกลมสี: สีเขียว วงกลม: วาด () [สี: สีเขียว X: 27 Y: 27, รัศมี: 100 การสร้างวงกลมของสี: สีขาว วงกลม: วาด () [สี: สีขาว, x: 64, y: 10 รัศมี: 100 การสร้างวงกลมสี: สีแดง วงกลม: วาด () [สี: สีแดง, X: 15 Y: 44, รัศมี: 100 วงกลม: วาด () [สี: สีเขียว X: 19 Y: 10 รัศมี: 100 วงกลม: วาด () [สี: สีเขียว, x: 94, y: 32, รัศมี: 100 วงกลม: วาด () [สี: สีขาว, x: 69, y: 98 รัศมี: 100 การสร้างวงกลมของสี: สีฟ้า วงกลม: วาด () [สี: สีฟ้า, X: 13 Y: 4, รัศมี: 100 วงกลม: วาด () [สี: สีเขียว X: 21 Y: 21 รัศมี: 100 วงกลม: วาด () [สี: สีฟ้า, x: 55, y: 86 รัศมี: 100 วงกลม: วาด () [สี: สีขาว, x: 90, y: 70 รัศมี: 100 วงกลม: วาด () [สี: สีเขียว X: 78 Y: 3, รัศมี: 100 วงกลม: วาด () [สี: สีเขียว X: 64 Y: 89, รัศมี: 100 วงกลม: วาด () [สี: สีฟ้า, X: 3, y: 91 รัศมี: 100 วงกลม: วาด () [สี: สีฟ้า, x: 62, y: 82 รัศมี: 100 วงกลม: วาด () [สี: สีเขียว X: 97 Y: 61, รัศมี: 100 วงกลม: วาด () [สี: สีเขียว X: 86 Y: 12 รัศมี: 100 วงกลม: วาด () [สี: สีเขียว X: 38 Y: 93, รัศมี: 100 วงกลม: วาด () [สี: สีแดง, x: 76, y: 82 รัศมี: 100 วงกลม: วาด () [สี: สีฟ้า, X: 95 Y: 82 รัศมี: 100