บทความนี้อธิบายรูปแบบโรงงานของรูปแบบการออกแบบ Java แบ่งปันสำหรับการอ้างอิงของคุณดังนี้:
1. โรงงานเรียบง่าย
ลองคิดเกี่ยวกับคำถามก่อน เมื่อเราเขียนโปรแกรมจะมีสถานการณ์เช่นนี้ วัตถุ A จำเป็นต้องเรียกวิธีการของวัตถุ B ในเวลานี้เรามักจะใช้คำหลักใหม่เพื่อสร้างอินสแตนซ์ B จากนั้นเรียกใช้วิธีการของอินสแตนซ์ B ข้อเสียของวิธีการนี้คือวิธีการของคลาส A เรียกชื่อคลาสของคลาส B โดยตรง (วิธีนี้เรียกว่าการเชื่อมต่อแบบหนัก) เมื่อระบบจำเป็นต้องได้รับการ refactored: เมื่อต้องใช้คลาส C แทนคลาส B โปรแกรมจะต้องแก้ไขรหัสคลาส A หากคลาส 100 หรือ 10,000 คลาสในแอปพลิเคชันเป็นรหัสยากต้องมีการแก้ไขสถานที่ 100 หรือ 10,000 แห่งซึ่งเป็นสิ่งที่น่ากลัวมาก
เมื่อมองถึงปัญหานี้จากมุมมองอื่น: สำหรับวัตถุแล้วมันจำเป็นต้องเรียกวิธีการของวัตถุ B และไม่สนใจเกี่ยวกับการใช้งานและกระบวนการสร้างวัตถุ B พิจารณาให้คลาส B ใช้อินเทอร์เฟซ IB โรงงาน ibfactory เพื่อรับอินสแตนซ์ IB ผ่านการออกแบบข้างต้น: หากคุณต้องการใช้คลาส C แทนคลาส B คุณจะต้องให้คลาส C ใช้อินเตอร์เฟส IB และเขียนรหัสการใช้งานใหม่เพื่อสร้างอินสแตนซ์ IB ในโรงงาน ibfactory เพื่อให้โรงงานสามารถสร้างอินสแตนซ์ C วิธีการออกแบบนี้ในการส่งมอบวัตถุหลายคลาสให้กับคลาสโรงงานสำหรับรุ่นที่เรียกว่ารูปแบบของโรงงานอย่างง่าย
นี่คือรหัสสำหรับรูปแบบโรงงานง่าย ๆ :
/*** โหมดโรงงานอย่างง่าย* อินเทอร์เฟซทั่วไปที่ต้องใช้อินสแตนซ์วัตถุที่ผลิตจากโรงงาน* อินเตอร์เฟสทรงผม* @author ผู้ดูแลระบบ**/เส้นผมต่อสาธารณะ {/*** วาดทรงผม*/โมฆะสาธารณะวาด ();}/*** ผมด้านซ้าย System.out.println ("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Righthair ใช้ผม {@Override โมฆะสาธารณะ Draw () { System.out.println ("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - ผู้ดูแลระบบ */ชั้นเรียนสาธารณะ hairtest {public static void main (string [] args) {hairfactory factory = hairfactory ใหม่ ();อย่างที่คุณเห็นหากคุณต้องการเปลี่ยน lefthair ที่สร้างขึ้นใน Hairtest เป็น Righthair คุณเพียงแค่ต้องปรับเปลี่ยนการใช้วิธี Gethair ในทรงผม
ข้อได้เปรียบของการใช้โหมดโรงงานอย่างง่ายคือการแยกผู้เรียกวัตถุและกระบวนการสร้างวัตถุ เมื่อผู้เรียกวัตถุต้องการวัตถุมันสามารถร้องขอโดยตรงจากโรงงานดังนั้นจึงหลีกเลี่ยงการเรียกวัตถุและคลาสการใช้งานวัตถุที่ถูกรวมเข้าด้วยกันในลักษณะที่ใช้รหัสยากเพื่อปรับปรุงความสามารถในการบำรุงรักษาและความยืดหยุ่นของระบบ แน่นอนว่าแบบจำลองโรงงานก็มีข้อบกพร่องเล็ก ๆ น้อย ๆ เมื่อผลิตภัณฑ์ได้รับการแก้ไขคลาสโรงงานจะต้องมีการแก้ไขตาม ที่นี่คุณสามารถใช้รูปแบบนโยบายเพื่อแก้ไขได้ ต่อไปนี้เป็นรหัส
ส่วนต่อประสานสาธารณะ Hairbuilder { / *** ทำทรงผม* @return* / Public Hair Gethair ();} ชั้นเรียนสาธารณะ Lefthairbuilder ใช้ Hairbuilder {@Override Public Hair Gethair () {คืน Lefthair ใหม่ (); }} คลาสสาธารณะ Righthairbuilder ใช้ HairBuilder {@Override Public Hair Gethair () {กลับ Righthair ใหม่ (); }} ชั้นเรียนสาธารณะ hairfactory {hairbuilder ส่วนตัว hairbuilder; public hairfactory (hairbuilder hairbuilder) {this.hairbuilder = hairbuilder; } โมฆะสาธารณะ sethairbuilder (hairbuilder hairbuilder) {this.hairbuilder = hairbuilder; } public hair gethair () {return hairbuilder.gethair (); }} ชั้นเรียนสาธารณะ hairtest {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {// hairbuilder builder = ใหม่ lefthairbuilder (); ผู้สร้าง hairbuilder = ใหม่ righthairbuilder (); โรงงานทรงผม = HairFactory ใหม่ (Builder); ผมผม = Factory.Gethair (); Hair.draw (); -ข้อดีของวิธีการนี้คือไม่จำเป็นต้องปรับเปลี่ยนคลาสโรงงานอีกต่อไปและเป็นนามธรรมของตรรกะการสร้างในโรงงานตามกลยุทธ์ที่แตกต่างกัน โปรแกรมใดที่ต้องสร้างวัตถุอะไร เพียงแค่ผ่านผู้สร้างที่เกี่ยวข้องไปยังโรงงานเครือข่าย
2. วิธีโรงงาน
ในรูปแบบโรงงานอย่างง่ายระบบใช้คลาสโรงงานเพื่อผลิตอินสแตนซ์ผลิตภัณฑ์ทั้งหมดและคลาสโรงงานจะตัดสินใจว่าระดับของอินสแตนซ์ที่จะผลิตนั่นคือคลาสโรงงานมีหน้าที่ในการตัดสินเชิงตรรกะการสร้างอินสแตนซ์และงานอื่น ๆ
หากคุณไม่ต้องการตัดสินเชิงตรรกะในชั้นเรียนโรงงานโปรแกรมสามารถให้โรงงานที่แตกต่างกันสำหรับหมวดหมู่ผลิตภัณฑ์ที่แตกต่างกันและคลาสโรงงานที่แตกต่างกันผลิตผลิตภัณฑ์ที่แตกต่างกันโดยไม่ต้องทำการตัดสินเชิงตรรกะที่ซับซ้อนในชั้นเรียนโรงงาน สิ่งนี้คล้ายกับโมเดลโรงงานง่าย ๆ รวมกับโมเดลกลยุทธ์ด้านบน ความแตกต่างคืออดีตมีโรงงานแห่งเดียวในขณะที่หลังต้องการโรงงานหลายแห่ง ด้านล่างเป็นรหัสสำหรับรูปแบบวิธีการโรงงาน
/*** รูปแบบวิธีการโรงงาน* อินเทอร์เฟซทั่วไปที่จำเป็นต้องใช้โดยอินสแตนซ์วัตถุที่ผลิตโดยโรงงาน* @author ผู้ดูแลระบบ**/บุคคลอินเทอร์เฟซสาธารณะ {โมฆะสาธารณะ drawperson ();} คนชั้นเรียนสาธารณะ System.out.println ("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- System.out.println ("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - @author Administrator * */Public Class WomenFactory ใช้งาน PersonFiStory {@Override บุคคลสาธารณะ getPerson () {กลับผู้หญิงใหม่ (); โรงงาน. getPerson ();คุณลักษณะทั่วไปของประเภทนี้คือมันผลิตผลิตภัณฑ์ที่สอดคล้องกันตามโรงงานต่าง ๆ ในรหัสลูกค้าและไม่จำเป็นต้องนำตรรกะที่ซับซ้อนทั้งหมดลงในคลาสโรงงานเพื่อตัดสิน มีข้อบกพร่องที่ชัดเจนในการนำไปใช้งานนี้ซึ่งเป็นลูกค้าที่เชื่อมต่อกับคลาสโรงงาน
3. โรงงานนามธรรม
การใช้สถาปัตยกรรมการออกแบบข้างต้นของวิธีการโรงงานรหัสไคลเอนต์จะถูกแยกออกจากคลาสการใช้งานของวัตถุที่เรียกว่า แต่จะนำข้อต่ออื่น: รหัสไคลเอ็นต์ถูกรวมกับคลาสโรงงานที่แตกต่างกัน เพื่อแก้ปัญหาการมีเพศสัมพันธ์นี้ให้พิจารณาเพิ่มคลาสโรงงานเพื่อสร้างอินสแตนซ์ของโรงงานและแยกโรงงานออกจากลูกค้าเพื่อผลิตผลิตภัณฑ์ วิธีการออกแบบนี้เรียกว่าโมเดลโรงงานนามธรรม ด้านล่างเป็นรหัสสำหรับรูปแบบโรงงานนามธรรม
/*** บทคัดย่อรูปแบบโรงงาน* โรงงานผลิต personfactory* @author ผู้ดูแลระบบ**/คลาสสาธารณะ personfactoryfactory {public personfictory getPersonFactory (ประเภทสตริง) {ถ้า (type.equalsignorecase ("man")) {ส่งคืน manfactory ใหม่ (); } else {ส่งคืนผู้หญิงใหม่ (); }}}/** * คลาสทดสอบไคลเอ็นต์ * @author Administrator * */Public Class Persontest {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {personfactory Factory = personfactoryfactory.getPersonFactory ("man"); บุคคล = Factory.getPerson (); person.drawperson (); -สำหรับเนื้อหาที่เกี่ยวข้องกับ Java เพิ่มเติมผู้อ่านที่สนใจในเว็บไซต์นี้สามารถดูหัวข้อ: "โครงสร้างข้อมูล Java และการสอนอัลกอริทึม", "บทสรุปของเคล็ดลับการดำเนินการ Java Dom Node", "บทสรุปของไฟล์ Java และเคล็ดลับการดำเนินการไดเรกทอรี" และ "สรุป
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน