ใน Java คุณยังคงไม่เปลี่ยนแปลงวัตถุที่เกี่ยวข้องใหม่สำหรับการสร้างอินสแตนซ์คลาสหรือไม่?
ด้วยโครงการเพิ่มเติมในมือปริมาณการเขียนโค้ดจะเพิ่มขึ้นตามธรรมชาติและค่อยๆคุณจะรู้สึกถึงรูปแบบการออกแบบ
จะทำการกระทำอินสแตนซ์ในชั้นเรียนเป็นลายลักษณ์อักษรการทำงานร่วมกันสูงการมีเพศสัมพันธ์ต่ำและมีความสามารถในการขยายตัวบางอย่าง?
บทความนี้พยายามที่จะเริ่มต้นด้วยรหัสที่สดใสสองสามรายการเพื่อนำเสนอคลาสอินสแตนซ์ Java ที่แตกต่างกันให้กับทุกคน
รหัสต่อไปนี้นำมาจากการใช้งานซอร์สโค้ด com.google.zxing:
Public Bitmatrix ENCODE (เนื้อหาสตริง, รูปแบบ BARCODEFORMAT, ความกว้าง int, ความสูง int, แผนที่ <ENCODEHINTTYPE,?> คำแนะนำ) พ่น WRITERException {Object Writer; switch (format.ordinal ()) {กรณีที่ 1: writer = ใหม่ AzTecWriter (); หยุดพัก; กรณีที่ 2: นักเขียน = ใหม่ codabarwriter (); หยุดพัก; กรณีที่ 3: นักเขียน = ใหม่ code39writer (); หยุดพัก; กรณีที่ 4: กรณีที่ 10: กรณีที่ 13: กรณีที่ 14: ค่าเริ่มต้น: โยน unlegalargumentException ใหม่ ("ไม่มีตัวเข้ารหัสสำหรับรูปแบบ" + รูปแบบ); กรณีที่ 5: นักเขียน = ใหม่ code128writer (); หยุดพัก; กรณีที่ 6: นักเขียน = ใหม่ dataMatrixWriter (); หยุดพัก; กรณีที่ 7: นักเขียน = ใหม่ ean8writer (); หยุดพัก; กรณีที่ 8: นักเขียน = ใหม่ ean13writer (); หยุดพัก; กรณีที่ 9: นักเขียน = ใหม่ itfwriter (); หยุดพัก; กรณีที่ 11: นักเขียน = ใหม่ pdf417writer (); หยุดพัก; กรณีที่ 12: นักเขียน = ใหม่ qrcodewriter (); หยุดพัก; กรณีที่ 15: นักเขียน = ใหม่ upcawriter (); หยุดพัก; กรณีที่ 16: นักเขียน = ใหม่ upceWriter (); } return ((นักเขียน) นักเขียน) .encode (เนื้อหา, รูปแบบ, ความกว้าง, ความสูง, คำแนะนำ); -BarCodeFormat เป็นเช่นนี้:
Public Enum BarcodeFormat {Aztec, Codabar, code_39, code_93, code_128, data_matrix, ean_8, ean_13, itf, maxicode, pdf_417, qr_code, rss_14 Private BarCodeFormat () {}} ฟังก์ชั่นที่จัดทำโดยซอร์สโค้ดคือการส่งออกข้อมูลลงในเมทริกซ์บิตผ่าน wirters บาร์โค้ดหลายประเภทแล้วส่งออกไปยังรูปภาพเพื่อสร้างบาร์โค้ดประเภทต่างๆที่สามารถมองเห็นได้ทุกที่
Bitmatrix bitmatrix = new MultiformatWriter (). encode (_text, barcodeformat.qr_code, qrcodewidth, qrcodeheight, คำแนะนำ);
matrixtoimagewriter.writetofile (bitmatrix, qrcodeformat, qrcodefile);
ผู้เขียนซอร์สโค้ดใช้คลาสคุณลักษณะใหม่ enum enum ที่แนะนำใน JDK 1.5 ที่นี่และเขียนคลาส BarcodeFormat ซึ่งกำหนดคุณสมบัติของบาร์โค้ดประเภทต่าง ๆ
Call Multiformatwriter.encode () เพื่อยกตัวอย่างคลาสเฉพาะตามหมายเลขลำดับของพารามิเตอร์ barcodeformat.xx ในคลาสการแจงนับ
switch (format.ordinal ()) {กรณีที่ 1: writer = ใหม่ AzTecWriter (); หยุดพัก; กรณีที่ 2: นักเขียน = ใหม่ codabarwriter (); หยุดพัก; กรณีที่ 3: นักเขียน = ใหม่ code39writer (); หยุดพัก; - คลาสนักเขียนบาร์โค้ดเหล่านี้ใช้วิธีการเข้ารหัสสองวิธีของนักเขียนอินเตอร์เฟสนามธรรม
Public Interface Writer {Bitmatrix Encode (String var1, BarCodeFormat var2, int var3, int var4) พ่น writeRexception; bitmatrix encode (สตริง var1, barcodeformat var2, int var3, int var4, แผนที่ <encodeHintType,?> var5) พ่น writeRexception;}คลาส Barcode Wirter ที่เฉพาะเจาะจงดำเนินการ logics ที่แตกต่างกันตามกฎของบาร์โค้ดประเภทต่างๆ
ผู้ใช้ไม่จำเป็นต้องให้ความสนใจกับการใช้งานภายในมากเกินไป พวกเขาจำเป็นต้องสร้างบาร์โค้ดประเภทใดที่พวกเขาต้องการในการเลือกและใช้ประเภทบาร์โค้ดที่เหมาะสม ตัวอย่างข้างต้นถูกนำไปใช้ในรหัส QR
ลองดูที่รหัสวิธีการสำหรับคลาสอินสแตนซ์แบบไดนามิกของเว็บคลาสสิก Framework Webwork:
การกำหนดค่าแบบคงที่ส่วนตัว getDefaultConfiguration () {ถ้า (defaultImpl == null) {defaultImpl = ใหม่ defaultConfiguration (); ลอง {string className = getString ("webwork.configuration"); if (! classname.equals (defaultImpl.getClass (). getName ())) {ลอง {defaultImpl = (การกำหนดค่า) ObjectFactory.getObjectFactory (). buildBean (thread.currentthread (). } catch (exception e) {log.error ("ไม่สามารถสร้างอินสแตนซ์การกำหนดค่า", e); }} ส่งคืน defaultImpl; } catch (unlueLargumentException localillegalargumentException) {}}}}ซอร์สโค้ดถูกนำมาจากการทำงานบนเว็บ ผู้ชมหลายคนอาจไม่เคยได้ยินเกี่ยวกับการเล่นเว็บ แต่ struts ควรเป็นที่รู้จักกันดี Struts2 Core ถูกเขียนใหม่จากการทำงานบนเว็บ
ฟังก์ชั่นที่จัดทำโดยซอร์สโค้ดด้านบนคือการยกระดับคลาสการอ่านไฟล์กำหนดค่าที่กำหนดโดยผู้ใช้และคำจำกัดความอยู่ในไฟล์การกำหนดค่า
ผู้เขียนซอร์สโค้ดใช้ thread.currentthread (). getContextClassLoader (). loadclass (className) คลาสโหลดเดอร์ในเธรดเพื่อยกตัวอย่างคลาสการอ่านไฟล์กำหนดค่าที่กำหนดเองแบบไดนามิกซึ่งเป็นวิธีที่มีประสิทธิภาพที่สุด
มอบหมายห่วงโซ่ของคลาสโหลดเดอร์: SystemClassLoader -> extensionClassLoader -> bootstrapclassloader
classloader ทางด้านซ้ายของห่วงโซ่การมอบหมายสามารถใช้คลาสที่โหลดโดย classloader ทางด้านขวา กลไกการโหลดคลาสคือการตรวจสอบว่ากำลังโหลดคลาสหรือไม่และไม่ได้ขอให้เหนือกว่า
ตัวโหลดคลาสทั้งสามนี้สอดคล้องกับลำดับความสำคัญของคอมไพเลอร์และเส้นทางที่แตกต่างกันเพื่อค้นหาไฟล์คลาส:
class.forname () ที่ใช้ในโครงการรายวันจะเริ่มถามจาก Bootstrapclassloader ซึ่งเป็นทรัพยากรที่ใช้เวลามากที่สุด
ผู้เขียนซอร์สโค้ดใช้ตัวโหลดคลาสเธรดที่นี่ซึ่งสอดคล้องกับ SystemClassLoader ซึ่งเป็นประสิทธิภาพสูงสุดอย่างไม่ต้องสงสัย