บทความนี้อธิบายการใช้งานเกมหมากรุก Gozi ตามโหมด Xiangyuan ของ Java แบ่งปันสำหรับการอ้างอิงของคุณดังนี้:
1. คำจำกัดความรูปแบบ
เพลิดเพลินไปกับโหมดโลกอย่างมีประสิทธิภาพรองรับวัตถุที่มีความละเอียดจำนวนมากในแบบที่ใช้ร่วมกัน ลดการใช้ประสิทธิภาพของระบบการสร้างอินสแตนซ์วัตถุโดยมัลติเพล็กซ์วัตถุที่มีอยู่ในหน่วยความจำ ภาษาอังกฤษของ Xiangyuan คือ Flyweight ซึ่งหมายถึงวัตถุขนาดเล็กโดยเฉพาะอย่างยิ่งนั่นคือวัตถุที่มีเนื้อละเอียด
2. ตัวอย่างของแบบจำลอง
1. การวิเคราะห์รูปแบบ
เรายืมเกม Gozi เพื่อแสดงรูปแบบนี้
2. ไดอะแกรมคลาสคงที่ของโหมดแวนแวน
3. ตัวอย่างรหัส
3.1 การสร้างหมากรุกนามธรรม
แพ็คเกจ com.demo.flyweight.object; บทคัดย่อระดับนามธรรม Abstractchessman {// Chesspaper พิกัดที่ได้รับการป้องกัน int x; ได้รับการป้องกัน int y; // หมวดหมู่หมากรุก (สีดำ | สีขาว) หมากรุกหมากรุกป้องกัน; Public AbstractChessman (หมากรุกสตริง) {this.chess = หมากรุก; } // จุดพิกัดจุดตั้งค่าโมฆะนามธรรมสาธารณะ (int x, int y); // แสดงข้อมูล chesspaper public public show () {system.out.println (this.chess + "(" + this.x + "," + this.y + ")"); -3.2 การสร้าง Blackchessman
แพ็คเกจ com.demo.flyweight.Object; Class Public Class BlackChessman ขยาย AbstractChessman { / ** * Constructor เริ่มต้น Black Chessman * / Public BlackChessman () {Super ("●"); System.out.println ("-Blackchessman Construction Exec !!!"); } // การตั้งค่าพิกัดจุด @Override จุดโมฆะสาธารณะ (int x, int y) {this.x = x; this.y = y; // แสดงเนื้อหาหมากรุกแสดง (); -3.3 สร้าง Whitechessman
แพ็คเกจ com.demo.flyweight.Object; Class Public Class Whitechessman ขยาย AbstractChessman { / ** * Constructor เริ่มต้นหมากรุกสีขาว * / Public Whitechessman () {super ("○"); System.out.println ("-Whitechessman Construction Exec !!!"); } // การตั้งค่าพิกัดจุด @Override จุดโมฆะสาธารณะ (int x, int y) {this.x = x; this.y = y; // แสดงเนื้อหาชิ้นหมากรุกแสดง (); -3.4 สร้างโรงงานหมากรุก
แพ็คเกจ com.demo.flyweight.factory; นำเข้า java.util.hashtable; นำเข้า com.demo.flyweight.object.abstractchessman; นำเข้า com.demo.flyweight.object.blackchessman; นำเข้า com.demo.flywetion fivechessmanfactory fivechessmanfactory = ใหม่ fivechessmanfactory (); // แคชเพื่อจัดเก็บวัตถุที่ใช้ร่วมกัน hashtable สุดท้าย <character, AbstractChessman> cache = new hashtable <character, AbstractChessman> (); // การแปรรูปคอนสตรัคเตอร์ส่วนตัว fivechessmanfactory () {} // รับ Singleton โรงงานสาธารณะคงที่ fivechessmanfactory getinstance () {return fivechessmanfactory; } / ** * รับชิ้นหมากรุกตามตัวละคร * * @param c * (b: หมากรุกสีดำ: หมากรุกสีขาว) * @return * / สาธารณะบทคัดย่อ abstractchessman getchessmanobject (ถ่าน c) {// ได้รับอินสแตนซ์ของวัตถุจำนำจากแคช if (AbstractChessman == null) {// หากไม่มีข้อมูลอินสแตนซ์วัตถุที่จำนำในแคชให้สร้างอินสแตนซ์วัตถุจำนำและใส่ไว้ในสวิตช์แคช (c) {กรณี 'B': AbstractChessman = New BlackChessman (); หยุดพัก; กรณี 'W': AbstractChessman = New Whitechessman (); หยุดพัก; ค่าเริ่มต้น: break; } // เพื่อป้องกันไม่ให้อักขระที่ผิดกฎหมายเข้าสู่ null ถ้า (Abstractchessman! = null) {// ใส่ this.cache.put (C, Abstractchessman); }} // หากมีวัตถุหมากรุกในแคชให้ส่งคืน AbstractChessman โดยตรง -3.5 การใช้งานไคลเอนต์
แพ็คเกจ com.demo; นำเข้า java.util.random; นำเข้า com.demo.flyweight.factory.fivechessmanfactory; นำเข้า com.demo.flyweight.object.abstractchessman;/** แอปพลิเคชันหลัก * * @author */ลูกค้าชั้นเรียน โรงงาน fivechessmanfactory fivechessmanfactory = fivechessmanfactory .getInstance (); สุ่มสุ่ม = ใหม่สุ่ม (); int radom = 0; AbstractChessman AbstractChessman = NULL; // รับชิ้นหมากรุกสำหรับ (int i = 0; i <10; i ++) {radom = random.nextint (2); สวิตช์ (radom) {// รับกล่องหมากรุกสีดำ 0: AbstractChessman = fivechessmanfactory.getChessManObject ('B'); หยุดพัก; // รับ The White Chess Case 1: AbstractChessman = FivechessManfactory.getChessManObject ('W'); หยุดพัก; } if (AbstractChessman! = null) {AbstractChessman.Point (i, random.nextint (15)); -4. ผลการดำเนินงาน
-Whitechessman Construction Exec !!!
○ (0,2)
○ (1,6)
-Blackchessman Construction Exec !!!
● (2,3)
○ (3,14)
○ (4,13)
○ (5,8)
● (6,14)
● (7,0)
● (8,3)
○ (9,8)
3. สองสถานะของโหมดความบันเทิง
สถานะที่แท้จริง : มันจะไม่เปลี่ยนแปลงเมื่อมีการเปลี่ยนแปลงของสภาพแวดล้อมมันถูกเก็บไว้ในข้อมูลสถานะภายในของวัตถุ Entrinsic สถานะที่แท้จริงนี้สามารถแบ่งปันได้ สำหรับวัตถุเอนไซม์ใด ๆ ค่าของมันจะเหมือนกันทุกประการ เช่นเดียวกับ "ชิ้นสีดำ" และ "ชิ้นสีขาว" ในโกจิสถานะที่แสดงถึงคือสถานะภายใน
สถานะภายนอก : มันจะเปลี่ยนไปตามการเปลี่ยนแปลงของสภาพแวดล้อมดังนั้นจึงไม่สามารถแบ่งปันสถานะได้ สำหรับวัตถุที่แตกต่างกันของสกุลค่าของมันอาจแตกต่างกัน สถานะภายนอกของวัตถุ Xiangyuan จะต้องได้รับการบันทึกโดยลูกค้า หลังจากที่วัตถุ Xiangyuan ถูกสร้างขึ้นและจำเป็นต้องใช้มันจะถูกส่งผ่านไปยังวัตถุ Xiangyuan เช่นเดียวกับข้อมูลตำแหน่งของ Gozi รัฐที่เป็นตัวแทนเป็นสถานะภายนอกของวัตถุของนิเวศวิทยา
ดังนั้นสถานะภายนอกและภายในของ Xiangyuan จึงเป็นสองรัฐอิสระและไม่มีการเชื่อมต่อซึ่งกันและกัน
iv. หลักการออกแบบโมเดลนี้
1. แบ่งปันวัตถุที่ละเอียดเพื่อลดพื้นที่หน่วยความจำ
2. แยกชิ้นส่วนที่เปลี่ยนแปลงอย่างมีประสิทธิภาพและชิ้นส่วนที่ไม่เปลี่ยนแปลงของระบบ
5. ใช้โอกาส
1. เมื่อมีอินสแตนซ์ของวัตถุประเภทหนึ่งในระบบมากมาย
2. ในการออกแบบระบบหลังจากการจำแนกอินสแตนซ์ของวัตถุมันเป็นเวลาที่จะพบว่ามีหมวดหมู่ที่แตกต่างกันจริงไม่กี่
6. ไดอะแกรมคลาสคงที่ของโหมดแวนแวน
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับอัลกอริทึม Java ผู้อ่านที่มีความสนใจในเว็บไซต์นี้สามารถดูหัวข้อ: "โครงสร้างข้อมูล Java และการสอนอัลกอริทึม", "บทสรุปของเคล็ดลับการดำเนินงาน Java Dom", "บทสรุปของไฟล์ Java และเคล็ดลับการดำเนินการไดเรกทอรี" และ "สรุป
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน