Builder: แยกการสร้างวัตถุที่ซับซ้อนออกจากการเป็นตัวแทนเพื่อให้กระบวนการก่อสร้างเดียวกันสามารถสร้างการเป็นตัวแทนที่แตกต่างกัน
ใช้สถานการณ์:
แผนภาพชั้นเรียนทั่วไป:
ตัวอย่างเช่น: อุปกรณ์จำนวนมากในชีวิตของเรามีอยู่ในรูปแบบการประกอบเช่นคอมพิวเตอร์เดสก์ท็อป ผู้ผลิตบางรายจะเปิดโฮสต์คอมพิวเตอร์ที่ประกอบขึ้นด้วยการกำหนดค่าเริ่มต้น (โหมดวิธีการแม่แบบสามารถใช้งานได้ที่นี่) ลูกค้าสามารถซื้อผลิตภัณฑ์ที่มีการกำหนดค่าเริ่มต้นหรือพวกเขาสามารถขอให้ผู้ผลิตประกอบโฮสต์ใหม่ด้วยการกำหนดค่าและวิธีการประกอบที่แตกต่างกัน ณ จุดนี้เราสามารถใช้โมเดลผู้สร้างเพื่อตอบสนองความต้องการของลูกค้าพิเศษ
โปรดทราบว่าในตัวอย่างนี้ผู้ผลิตจะประกอบเป็นโฮสต์อีกครั้งนั่นคือโฟกัสอยู่ที่แต่ละองค์ประกอบของโฮสต์ซึ่งสอดคล้องกับสถานการณ์การใช้งานที่กำหนดโดยโหมดผู้สร้างด้านบน
การใช้รหัสง่าย ๆ มีดังนี้:
// คลาสผลิตภัณฑ์บทคัดย่อโดยใช้โหมดวิธีการเทมเพลตผลิตภัณฑ์ที่แตกต่างกันมี "ส่วนประกอบ" ที่แตกต่างกันคลาสนามธรรม AbstractProduct {Void Void Part01 () ที่ได้รับการป้องกัน เป็นโมฆะบทคัดย่อที่ได้รับการป้องกันส่วนที่ 02 (); เป็นโมฆะบทคัดย่อที่ได้รับการป้องกันส่วนที่ 03 (); // วิธีการเทมเพลตให้วิธีการประกอบเริ่มต้นการสร้างผลิตภัณฑ์เริ่มต้นสาธารณะ final AbstractProduct defaultProduct () {part01 (); ตอนที่ 02 (); ตอนที่ 03 (); ส่งคืนสิ่งนี้ // ส่งคืนวัตถุปัจจุบันนั่นคือผลิตภัณฑ์ที่มีวิธีการประกอบเริ่มต้น}} // ผลิตภัณฑ์เฉพาะ A และ B ผลิตภัณฑ์ที่แตกต่างกันใช้ "ส่วนประกอบส่วน" ที่แตกต่างกัน concreteProducta ขยายบทคัดย่อ {void part01 () {system.out } void protected part02 () {system.out.println ("ผลิตภัณฑ์ A: part02 () ... "); } void protected part03 () {system.out.println ("ผลิตภัณฑ์ A: part03 () ... "); }} คลาส concreteProductB ขยายบทคัดย่อ product {void protected part01 () {system.out.println ("ผลิตภัณฑ์ B: part01 () ... "); } void protected part02 () {system.out.println ("ผลิตภัณฑ์ B: part02 () ... "); } void protected part03 () {system.out.println ("ผลิตภัณฑ์ B: part03 () ... "); }} // ตัวสร้างบทคัดย่อกำหนดวิธีการรวมกันที่แต่ละผลิตภัณฑ์ควรใช้ buildpart () และมาตรฐานสำหรับการผลิต buildproduct () คลาสนามธรรม AbstractBuilder {Public Public Void Buildpart (); บทคัดย่อสาธารณะนามธรรม BuildProduct (); } / * * หากตัวสร้างเฉพาะไม่พอใจกับผลิตภัณฑ์เริ่มต้น (เช่นเมื่อวิธีการเริ่มต้น product () ในผลิตภัณฑ์นามธรรมเรียกว่า) * คุณไม่สามารถเรียกมันให้ได้รับผลิตภัณฑ์ แต่ใช้ตัวสร้างเฉพาะเพื่อเปลี่ยนวิธีการผลิตและการประกอบ โมฆะสาธารณะ buildpart () {this.producta.part03 (); this.producta.part02 (); this.producta.part01 (); } Public AbstractProduct BuildProduct () {return this.producta; }} คลาส ConcreteBuilderB ขยาย AbstractBuilder {Private AbstractProduct ProductB = ใหม่ ConcreteProductB (); โมฆะสาธารณะ buildpart () {this.productb.part02 (); this.productb.part01 (); // องค์ประกอบหนึ่งในผลิตภัณฑ์ B ถูกละเว้นตัวอย่างเช่นฟังก์ชั่นของส่วนนี้ไม่จำเป็นโดยลูกค้า // this.productb.part03 (); } public AbstractProduct buildProduct () {return this.productb; }} // ผู้อำนวยการคลาสผู้สร้างที่ให้การถือหุ้นแต่ละผลิตภัณฑ์ให้วิธีการประกอบที่แตกต่างกันสำหรับผู้ใช้ที่ต้องการผลิตภัณฑ์ที่แตกต่างจากผู้อำนวยการระดับผลิตภัณฑ์เริ่มต้น AbstractBuilder Private BuildB = ใหม่ ConcreteBuilderb (); Public AbstractProduct getProducta () {this.buildera.buildpart (); ส่งคืนสิ่งนี้ buildera.buildproduct (); } บทคัดย่อสาธารณะ getProductb () {this.builderb.buildpart (); ส่งคืนสิ่งนี้ builderb.buildproduct (); }} // ไคลเอ็นต์คลาสทดสอบระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {system.out.println ("ใช้โหมดวิธีการเทมเพลตเพื่อรับผลิตภัณฑ์เริ่มต้น"); AbstractProduct defaultProducta = ใหม่ concreteproducta (). defaultProduct (); System.out.println ("/คลาสผู้อำนวยการ NUSE เพื่อรับผลิตภัณฑ์ A ด้วยวิธีการประกอบที่แตกต่างกัน"); ผู้อำนวยการผู้อำนวยการ = ผู้อำนวยการคนใหม่ (); Director.getProducta (); System.out.println ("/คลาสผู้อำนวยการ NUSE เพื่อรับผลิตภัณฑ์ B ด้วยวิธีการประกอบที่แตกต่างกัน"); Director.getProductb (); - ผลการทดสอบ:
ใช้โหมดวิธีการเทมเพลตเพื่อรับผลิตภัณฑ์เริ่มต้นก
ผลิตภัณฑ์ A: Part01 () ...
ผลิตภัณฑ์ A: Part02 () ...
ผลิตภัณฑ์ A: Part03 () ...
ใช้คลาสผู้อำนวยการเพื่อรับผลิตภัณฑ์ด้วยวิธีการประกอบที่แตกต่างกัน
ผลิตภัณฑ์ A: Part03 () ...
ผลิตภัณฑ์ A: Part02 () ...
ผลิตภัณฑ์ A: Part01 () ...
ใช้คลาสผู้อำนวยการเพื่อรับผลิตภัณฑ์ B ด้วยวิธีการประกอบที่แตกต่างกัน
ผลิตภัณฑ์ B: Part02 () ...
ผลิตภัณฑ์ B: Part01 () ...
ในความเป็นจริงในตัวอย่างนี้หมวดหมู่ผลิตภัณฑ์ใช้โหมดวิธีการเทมเพลตที่กล่าวถึงในบทความก่อนหน้านั่นคือ defaultProduct () ให้วิธีการประกอบส่วนประกอบเริ่มต้นของผลิตภัณฑ์
แต่ฉันมีคำถามที่นี่ วิธีการประกอบเริ่มต้นที่เรียกว่าที่มีให้ในคลาส AbstractProduct โดยใช้รูปแบบวิธีการเทมเพลตเป็นเพียงการพิมพ์ประโยคทดสอบสองสามประโยคและมันไม่ได้ส่งคืนผลิตภัณฑ์ที่เฉพาะเจาะจงจริงๆ อย่างไรก็ตามฉันไม่ทราบว่าวิธีการประมวลผลของการส่งคืนวัตถุปัจจุบัน (ส่งคืนสิ่งนี้;) ในตัวอย่างข้างต้นนั้นสมเหตุสมผลหรือไม่?
นอกจากนี้หลังจากเขียนบทความเหล่านี้เกี่ยวกับการใช้รูปแบบการออกแบบด้วยรหัส Java ฉันพบว่ารูปแบบตัวสร้างตัวสร้างนี้ดูเหมือนจะรวมรูปแบบโรงงานนามธรรมและรูปแบบวิธีการเทมเพลต ย่อหน้าข้างต้นได้กล่าวถึงข้อสงสัยของฉันแล้ว สำหรับรูปแบบโรงงานนามธรรมฉันคิดว่าชั้นเรียนผู้กำกับในตัวอย่างรหัสข้างต้นนั้นคล้ายกับคลาสโรงงานเฉพาะของโรงงานนามธรรม แต่คลาสผู้อำนวยการก็ต้องสร้างวิธีการประกอบผลิตภัณฑ์ก่อนที่จะกลับมาผลิตภัณฑ์ บางทีมันอาจเป็น "การสร้าง" ที่ทำให้โมเดลผู้สร้างมุ่งเน้นไปที่การประกอบส่วนต่าง ๆ ของผลิตภัณฑ์ในขณะที่โมเดลโรงงานนามธรรมมุ่งเน้นไปที่การสร้างผลิตภัณฑ์ขั้นสุดท้ายเท่านั้น
ฉันเคยอ่านประโยคมาก่อนและบอกว่ามีการกล่าวอย่างคร่าวๆว่า: หากปัญหาคอมพิวเตอร์ใด ๆ ยากที่จะแก้ไขมันสามารถจัดการได้โดยการเพิ่มชั้นกลาง ตอนนี้ฉันคิดเกี่ยวกับมันดูเหมือนว่าทั้งโรงงานนามธรรมและโหมดผู้สร้างใช้ "หลักการ" นี้เพื่อให้ได้เอฟเฟกต์ที่ต้องการ ตัวอย่างเช่นมีคลาสโรงงานนามธรรมในโรงงานนามธรรมและมีชั้นเรียนผู้อำนวยการใน Builder ในการวิเคราะห์ขั้นสุดท้ายมันคือการห่อหุ้มและซ่อนรายละเอียดบางอย่างและแยกพวกเขาออกจากการใช้งานและการใช้งาน
ฉันคิดว่าคุณต้องเข้าใจข้อกังวลและสถานการณ์ที่เกี่ยวข้องของแต่ละรุ่นก่อนที่คุณจะเข้าใจสิ่งเหล่านี้ได้ดีขึ้น
บางทีโหมดเหล่านี้อาจเป็นโหมดที่สร้างสรรค์ทั้งหมดและฉันไม่มีประสบการณ์ในทางปฏิบัติซึ่งทำให้ฉันสับสนเล็กน้อยเกี่ยวกับสิ่งเหล่านี้ ... ฉันไม่กลัวคิดนิดหน่อยในกระบวนการดำเนินการทั้งหมด
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้และฉันหวังว่ามันจะเป็นแรงบันดาลใจให้คุณเรียนรู้