1 ภาพรวม
รูปแบบตัวสร้าง (รูปแบบตัวสร้าง) ส่วนใหญ่จะใช้เพื่อ "สร้างวัตถุที่ซับซ้อนทีละขั้นตอน" ซึ่ง "ทีละขั้นตอน" เป็นอัลกอริธึมที่เสถียร ในขณะที่ส่วนต่างๆ ของวัตถุที่ซับซ้อนเปลี่ยนแปลงบ่อยครั้ง ดังนั้นรูปแบบตัวสร้างจึงใช้เพื่อแก้ไขข้อกำหนดที่เปลี่ยนแปลงของ "ส่วนของวัตถุ" เป็นหลัก ช่วยให้สามารถควบคุมกระบวนการก่อสร้างวัตถุได้ละเอียดยิ่งขึ้น
2 ตัวอย่าง
ยกตัวอย่างการผลิตโทรศัพท์มือถือแต่ละรุ่น โดยแบ่งออกเป็น หน้าจอ ซีพียู และแบตเตอรี่ ปัจจุบันมีโทรศัพท์มือถือที่ผลิตอยู่ 2 ประเภท ได้แก่ Apple และ Samsung
แอปเปิล:
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ org.scott.builder.before.use;
นำเข้า java.util.ArrayList;
นำเข้า java.util.List;
-
* @ผู้เขียน สกอตต์
* @เวอร์ชั่น 2013-11-20
* @คำอธิบาย
-
ApplePhone ระดับสาธารณะ {
รายการ <String> parts = new ArrayList<String>();
โมฆะสาธารณะ createCPU () {
parts.add("ถ้วย: วอลคอมม์");
-
โมฆะสาธารณะ createScreen() {
parts.add("หน้าจอ: JDI");
-
โมฆะสาธารณะ createBattery () {
parts.add("แบตเตอรี่: เดอไซ");
-
โมฆะสาธารณะแสดง () {
System.out.print("ข้อมูลส่วนประกอบของผลิตภัณฑ์:");
สำหรับ (ส่วนสตริง: ส่วน) {
System.out.print (ส่วน + "/t");
-
-
-
ซัมซุง:
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ org.scott.builder.before.use;
นำเข้า java.util.ArrayList;
นำเข้า java.util.List;
-
* @ผู้เขียน สกอตต์
* @เวอร์ชั่น 2013-11-20
* @คำอธิบาย
-
SamsungPhone ระดับสาธารณะ {
รายการ <String> parts = new ArrayList<String>();
โมฆะสาธารณะ createCPU () {
parts.add("ถ้วย: MTK");
-
โมฆะสาธารณะ createScreen() {
parts.add("หน้าจอ: ซัมซุง");
-
โมฆะสาธารณะ createBattery () {
parts.add("แบตเตอรี่: เดอไซ");
-
โมฆะสาธารณะแสดง () {
System.out.print("ข้อมูลส่วนประกอบของผลิตภัณฑ์:");
สำหรับ (ส่วนสตริง: ส่วน) {
System.out.print (ส่วน + "/t");
-
-
-
ลูกค้าทดสอบ:
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ org.scott.builder.before.use;
-
* @ผู้เขียน สกอตต์
* @เวอร์ชั่น 2013-11-20
* @คำอธิบาย
-
BuilderTest คลาสสาธารณะ {
ApplePhone iphone แบบคงที่ส่วนตัว = ApplePhone ใหม่ ();
SamsungPhone samPhone แบบคงที่ส่วนตัว = SamsungPhone ใหม่ ();
โมฆะคงที่สาธารณะ main (String args []) {
iphone.createCPU();
iphone.createScreen();
iphone.createBattery();
iphone.show();
samPhone.createCPU();
samPhone.createScreen();
samPhone.createBattery();
samPhone.show();
-
-
คุณพบปัญหาหรือไม่? นั่นคือแต่ละขั้นตอนการผลิตโทรศัพท์มือถือจะเหมือนกัน กล่าวคือ ชื่อของกระบวนการจะเหมือนกันแต่กระบวนการเฉพาะของแต่ละกระบวนการยังคงไม่เปลี่ยนแปลง การประมวลผลการเปลี่ยนแปลงแต่ละกระบวนการ จากนี้ เราสามารถแยกสิ่งที่ไม่เปลี่ยนแปลง "ไม่เปลี่ยนแปลงเพื่อรับมือกับการเปลี่ยนแปลงทั้งหมด" และส่งต่อการเปลี่ยนแปลงไปยังผลิตภัณฑ์เฉพาะ
ทำอย่างไรโดยเฉพาะ? คราวนี้โหมด Builder มีประโยชน์
ก่อนอื่น มาดูอินเทอร์เฟซของโทรศัพท์กันก่อน:
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ org.scott.builder.after.use;
นำเข้า java.util.ArrayList;
นำเข้า java.util.List;
-
* @ผู้เขียน สกอตต์
* @เวอร์ชั่น 2013-11-20
* @คำอธิบาย
-
โทรศัพท์ระดับนามธรรมสาธารณะ {
รายการที่ได้รับการป้องกัน <String> parts = new ArrayList<String>();
โมฆะสาธารณะเพิ่ม (ส่วนสตริง) {
parts.add(ส่วนหนึ่ง);
-
โมฆะสาธารณะแสดง () {
System.out.print("ข้อมูลส่วนประกอบของผลิตภัณฑ์:");
สำหรับ (ส่วนสตริง: ส่วน) {
System.out.print (ส่วน + "/t");
-
-
-
หมวดหมู่โทรศัพท์มือถือ Apple:
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ org.scott.builder.after.use;
-
* @ผู้เขียน สกอตต์
* @เวอร์ชั่น 2013-11-20
* @คำอธิบาย
-
ApplePhone ระดับสาธารณะขยายโทรศัพท์ {
-
หมวดหมู่โทรศัพท์มือถือซัมซุง:
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ org.scott.builder.after.use;
-
* @ผู้เขียน สกอตต์
* @เวอร์ชั่น 2013-11-20
* @คำอธิบาย
-
SamsungPhone ระดับสาธารณะขยายโทรศัพท์ {
-
จากนั้นกำหนดตัวสร้างอินเทอร์เฟซสำหรับขั้นตอนการผลิต:
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ org.scott.builder.after.use;
-
* @ผู้เขียน สกอตต์
* @เวอร์ชั่น 2013-11-20
* @คำอธิบาย
-
เครื่องมือสร้างส่วนต่อประสานสาธารณะ {
โมฆะสาธารณะ buildCPU ();
โมฆะสาธารณะ buildScreen();
โมฆะสาธารณะ buildBattery ();
โทรศัพท์สาธารณะ getPhone();
-
เครื่องมือสร้างสำหรับ iPhone:
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ org.scott.builder.after.use;
-
* @ผู้เขียน สกอตต์
* @เวอร์ชั่น 2013-11-20
* @คำอธิบาย
-
ApplePhoneBuilder คลาสสาธารณะใช้งาน Builder {
โทรศัพท์ส่วนตัว โทรศัพท์ = ApplePhone ใหม่ ();
@แทนที่
โมฆะสาธารณะ buildCPU () {
phone.add("ถ้วย: วอลคอมม์");
-
@แทนที่
โมฆะสาธารณะ buildScreen () {
phone.add("หน้าจอ: JDI");
-
@แทนที่
โมฆะสาธารณะ buildBattery () {
phone.add("แบตเตอรี่: ดีไซ");
-
@แทนที่
โทรศัพท์สาธารณะ getPhone() {
โทรศัพท์กลับ;
-
-
เครื่องมือสร้างสำหรับโทรศัพท์มือถือ Samsung:
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ org.scott.builder.after.use;
-
* @ผู้เขียน สกอตต์
* @เวอร์ชั่น 2013-11-20
* @คำอธิบาย
-
SamsungPhoneBuilder คลาสสาธารณะใช้งาน Builder {
โทรศัพท์ส่วนตัว โทรศัพท์ = SamsungPhone ใหม่ ();
@แทนที่
โมฆะสาธารณะ buildCPU () {
phone.add("ถ้วย: MTK");
-
@แทนที่
โมฆะสาธารณะ buildScreen () {
phone.add("หน้าจอ: ซัมซุง");
-
@แทนที่
โมฆะสาธารณะ buildBattery () {
phone.add("แบตเตอรี่: ดีไซ");
-
@แทนที่
โทรศัพท์สาธารณะ getPhone() {
โทรศัพท์กลับ;
-
-
ผู้อำนวยการผู้แนะนำการผลิตโทรศัพท์มือถือโดยเฉพาะ:
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ org.scott.builder.after.use;
-
* @ผู้เขียน สกอตต์
* @เวอร์ชั่น 2013-11-20
* @คำอธิบาย
-
ผู้อำนวยการชั้นเรียนสาธารณะ {
ตัวสร้างส่วนตัว ตัวสร้าง;
ผู้อำนวยการสาธารณะ(ผู้สร้างอาคาร){
this.builder = ผู้สร้าง;
-
โครงสร้างโมฆะสาธารณะ () {
builder.buildCPU();
builder.buildScreen();
builder.buildBattery();
-
-
ในที่สุดก็เขียนคลาสทดสอบ:
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ org.scott.builder.after.use;
-
* @ผู้เขียน สกอตต์
* @เวอร์ชั่น 2013-11-20
* @คำอธิบาย
-
BuilderTest คลาสสาธารณะ {
ตัวสร้างคงที่ส่วนตัว iPhoneBuilder = ApplePhoneBuilder ใหม่ ();
ตัวสร้างคงที่ส่วนตัว samPhoneBuilder = SamsungPhoneBuilder ใหม่ ();
โมฆะคงที่สาธารณะ main (String [] args) {
กรรมการ กรรมการ = กรรมการคนใหม่(iPhoneBuilder);
ผู้อำนวยการสร้าง();
โทรศัพท์ โทรศัพท์ = iPhoneBuilder.getPhone();
System.out.println("iphone");
โทรศัพท์.แสดง();
ผู้อำนวยการ = ผู้อำนวยการคนใหม่ (samPhoneBuilder);
ผู้อำนวยการสร้าง();
โทรศัพท์ = samPhoneBuilder.getPhone();
System.out.println("/nsamSung");
โทรศัพท์.แสดง();
-
-
ผลการวิ่ง:
คัดลอกรหัสรหัสดังต่อไปนี้:
ไอโฟน
ข้อมูลชิ้นส่วนผลิตภัณฑ์: ถ้วย: Qualcomm หน้าจอ: JDI แบตเตอรี่: DeSai
ซัมซุง
ข้อมูลชิ้นส่วนผลิตภัณฑ์: ถ้วย: MTK หน้าจอ: Samsung แบตเตอรี่: DeSai
คลาสเอนทิตีโทรศัพท์สองคลาสที่นี่ว่างเปล่า หากเป็นกรณีนี้ สามารถละเว้นคลาสเหล่านั้นได้ หากสามารถละเว้นอินเทอร์เฟซโทรศัพท์ได้ จะเหลือเพียงคลาสการใช้งาน Director, Builder และ Builder ที่เฉพาะเจาะจงเท่านั้น นอกจากนี้คลาส ApplePhone และคลาส SamsungPhone ยังเป็นคลาสที่เกี่ยวข้องกันสองคลาสขึ้นไป หากคุณพบคลาสสองคลาสขึ้นไปที่ไม่เกี่ยวข้องกันมากนัก ก็ไม่จำเป็นต้องมีอินเทอร์เฟซสาธารณะอีกต่อไป , ดังนั้นจะกำหนดค่าที่ส่งคืนของเมธอด getPhone() ที่ระบุในอินเทอร์เฟซ Builder ได้อย่างไร?
ไม่ว่าประเภทค่าที่ส่งคืนจะเป็น ApplePhone หรือ SamsungPhone ปัญหาจะเกิดขึ้นเนื่องจากประเภทของผลลัพธ์ที่ส่งคืนไม่สม่ำเสมอ ในขณะนี้ โทรศัพท์สามารถกำหนดเป็นอินเทอร์เฟซที่ว่างเปล่า (อินเทอร์เฟซที่ไม่มีวิธีการใด ๆ ) จากนั้นให้คลาสผลิตภัณฑ์เฉพาะเหล่านี้ที่ไม่มีความสัมพันธ์กันใช้อินเทอร์เฟซนี้ จากนั้นจึงใช้ประเภทค่าตอบแทนของ getPhone( ) ที่ระบุในอินเทอร์เฟซ Builder ยังคงเป็นประเภท Phone ซึ่งช่วยแก้ปัญหาได้ อย่างไรก็ตาม ในกรณีนี้ ไม่จำเป็นต้องใช้โหมดตัวสร้าง