“ StringBuilder” เป็นแอปพลิเคชั่นของรูปแบบการออกแบบตัวสร้างหรือไม่?


31

รูปแบบ "ตัวสร้าง" ถูก จำกัด ให้จัดการกับรูปแบบการต่อต้าน "ตัวสร้างเหลื่อม" หรืออาจกล่าวได้ว่าเป็นการแก้ปัญหาทั่วไปของการสร้างวัตถุที่ไม่เปลี่ยนรูปแบบที่ซับซ้อนมากขึ้นหรือไม่?

StringBuilderชั้นจะมีคำว่า "ผู้สร้าง" ในชื่อของมัน แต่มันมีอะไรจะทำอย่างไรกับความเหลื่อมก่อสร้างมันก็ช่วยให้เราได้รวบรวมข้อมูลทั้งหมดที่เราต้องผ่านการสร้างของวัตถุที่ไม่เปลี่ยนรูป

สำหรับฉันดูเหมือนว่าคำตอบจะชัดเจนมาก "ใช่" แต่ดูเหมือนจะมีความขัดแย้งในหัวข้อดังนั้นฉันหวังว่าบางคนอาจจะอธิบายได้

ฉันตอบคำถามนี้: โปรแกรมเมอร์ SE: "งานจริง" ที่ถูกต้องในตัวสร้าง? ที่ OP ต้องการสร้างวัตถุ (น่าจะไม่เปลี่ยนรูป) ที่มีต้นไม้ที่ซับซ้อนและความคิดของรูปแบบ "ผู้สร้าง" โผล่ขึ้นมาและในขณะที่ทำการวิจัยผมพบว่า Q&A นี้ซึ่งดูเหมือนว่ารูปแบบการสร้างวัตถุ "StringBuilder" คือไม่ได้เป็นโปรแกรมของ "สร้าง" รูปแบบสำหรับเหตุผลที่ไม่ชัดเจนกับผม: Stackoverflow - StringBuilder และสร้างรูปแบบ (ผู้ที่ตอบคำถามนั้นล้มเหลวในการสร้างจุดที่น่าเชื่อถือเท่าที่ฉันสามารถบอกได้)


2
ฉันพบคำตอบของ Paul Sasik ในคำถาม Stack Overflow ที่น่าเชื่อถืออย่างสิ้นเชิง: StringBuilder เป็น "วิธีแก้ปัญหา" สำหรับปัญหาด้านประสิทธิภาพของการเชื่อมสตริงที่ไม่เปลี่ยนรูปแบบซึ่งไม่มีอะไรเพิ่มเติม ที่ดีที่สุด StringBuilder คือ "ชื่อน่าเสียดาย" คุณสามารถสร้างอาร์กิวเมนต์ที่ StringBuilder สามารถ "สร้าง" หน้าเว็บฉันคิดว่า แต่นั่นเป็นแอปพลิเคชันเฉพาะของกลไกทั่วไป
Robert Harvey

3
คำตอบของ Paul Sasik นั้นผิดสำหรับ Java - ฉันดูซอร์สโค้ดพื้นฐาน StringBuilderดูเหมือนจะใช้อาเรย์อักขระพื้นฐานเพื่อเป็นตัวแทนของสตริงและช่วยให้คุณทำสิ่งต่าง ๆ เช่นการแทรกและการลบได้ทุกเมื่อ ในที่สุดฉันคิดว่า StringBuilder เป็นวิธีแก้ปัญหาสำหรับวัตถุ String ที่ไม่เปลี่ยนรูป แต่อย่างอื่นก็ดูเหมือนว่าฉันจะเป็นไปตามเจตนาของรูปแบบการสร้าง
โธมัสโอเวนส์

4
ฉันต้องคิดเกี่ยวกับเรื่องนี้มากขึ้น - มันทำให้ฉันรำคาญ ฉันเกือบเริ่มเขียนว่าทำไมบางอย่างเช่น StringBuilder เป็นรูปแบบของตัวสร้างและทุกคนผิด แต่ฉันพบจุดอ่อนสองสามข้อทำให้ฉันเชื่อว่าฉันผิด แต่กลับจัดการกับความคิดแรกของฉัน ถ้าคุณดูที่เจตนาของรูปแบบตัวสร้างมันง่ายที่จะเห็นว่า "StringBuilder เป็นตัวสร้าง" หากคุณดูโครงสร้างของรูปแบบบิลเดอร์มันยากกว่า
โธมัสโอเวนส์

1
สำหรับสิ่งที่คุ้มค่าคำตอบในการโอเวอร์คล็อกแบบโอเวอร์เห็นด้วยกับความคิดเริ่มต้นของฉันว่า StringBuilder เป็นการใช้งานตัวสร้างและความคิดเห็นน่าสนใจ ดังนั้นคุณสามารถหาข้อโต้แย้งทั้งสองด้านได้ ฉันชอบคำถามนี้ - ฉันไม่รู้ว่าฉันสามารถสร้างคำตอบที่ดีได้หรือไม่ แต่เป็นคำถามที่น่าสนใจอย่างแน่นอน ฉันจะคิดถึงเรื่องนี้
โธมัสโอเวนส์

2
ไม่ใช่รูปแบบ GoF ทั้งหมดที่สามารถใช้ทดสอบได้ ฉันไม่ได้พูดว่า 'ฉันแค่พูดว่า'
Ben

คำตอบ:


36

A StringBuilderคล้ายกับ Builder Pattern แต่ไม่ได้แชร์อะไรมากกับคำอธิบาย GoF ของรูปแบบการออกแบบนี้ จุดเริ่มต้นของรูปแบบการออกแบบคือ

แยกการก่อสร้างวัตถุที่ซับซ้อนออกจากการเป็นตัวแทนเพื่อให้กระบวนการก่อสร้างเดียวกันสามารถสร้างการรับรองที่แตกต่างกัน

- จากรูปแบบการออกแบบโดย Gamma, Helm, Johnson, Vlissides

(หมายเหตุ:“ ซับซ้อน” โดยพื้นฐานแล้วหมายถึง“ ประกอบด้วยหลายส่วน” ไม่จำเป็นต้อง“ ซับซ้อน” หรือ“ ยาก”)

"การเป็นตัวแทนที่แตกต่าง" เป็นกุญแจสำคัญที่นี่ เช่นสมมติว่ากระบวนการก่อสร้างนี้:

interface ArticleBuilder {
  void addTitle(String title);
  void addParagraph(String paragraph);
}

void createArticle(ArticeBuilder articleBuilder) {
  articleBuilder.addTitle("Is String Builder an application of ...");
  articleBuilder.addParagraph("Is the Builder Pattern restricted...");
  articleBuilder.addParagraph("The StringBuilder class ...");
}

เราอาจท้ายด้วย a HtmlDocumentหรือ a TexDocumentหรือMarkdownDocumentขึ้นอยู่กับการใช้งานที่เป็นรูปธรรม:

class HtmlDocumentBuilder implements ArticleBuilder {
  ...
  HtmlDocument getResult();
}

HtmlDocumentBuilder b = new HtmlDocumentBuilder();
createArticle(b);
HtmlDocument dom = b.getResult();

ดังนั้นจุดกลางหนึ่งในรูปแบบ Builder เป็นความแตกต่าง หนังสือลวดลายการออกแบบเปรียบเทียบรูปแบบนี้กับบทคัดย่อจากโรงงาน:

Abstract Factory นั้นคล้ายกับ Builder ซึ่งอาจสร้างวัตถุที่ซับซ้อนได้เช่นกัน ความแตกต่างหลักคือรูปแบบของตัวสร้างจะเน้นไปที่การสร้างวัตถุที่มีความซับซ้อนทีละขั้นตอน [... ] Builder ส่งคืนผลิตภัณฑ์เป็นขั้นตอนสุดท้าย แต่เท่าที่โรงงาน Abstract เกี่ยวข้องผลิตภัณฑ์จะถูกส่งคืนทันที

- จากรูปแบบการออกแบบโดย Gamma, Helm, Johnson, Vlissides

ลักษณะทีละขั้นตอนนี้กลายเป็นรูปแบบที่ได้รับความนิยมมากขึ้นของรูปแบบของตัวสร้างดังนั้นในสำนวนทั่วไปรูปแบบของตัวสร้างจึงเป็นที่เข้าใจดังนี้:

แบ่งโครงสร้างของวัตถุออกเป็นหลายขั้นตอน สิ่งนี้ช่วยให้เราสามารถใช้อาร์กิวเมนต์ที่มีชื่อหรือพารามิเตอร์ทางเลือกแม้ในภาษาที่ไม่สนับสนุนคุณสมบัติเหล่านี้

Wikipedia กำหนดรูปแบบเช่นนี้:

รูปแบบตัวสร้างเป็นรูปแบบการออกแบบซอฟต์แวร์การสร้างวัตถุ ซึ่งแตกต่างจากรูปแบบโรงงานนามธรรมและรูปแบบการโรงงานที่มีความตั้งใจที่จะเปิดใช้งานหลายรูปแบบ, ความตั้งใจในการสร้างรูปแบบคือการหาวิธีการแก้เหลื่อมคอนสตรัคต่อต้านรูปแบบ[อ้างจำเป็น] [ ... ]

รูปแบบการสร้างมีประโยชน์อื่น มันสามารถใช้สำหรับวัตถุที่มีข้อมูลแบน (รหัส html, แบบสอบถาม SQL, ใบรับรอง X.509 ... ) กล่าวคือข้อมูลที่ไม่สามารถแก้ไขได้ง่าย ข้อมูลประเภทนี้ไม่สามารถแก้ไขทีละขั้นตอนและต้องแก้ไขในครั้งเดียว วิธีที่ดีที่สุดในการสร้างวัตถุเช่นนี้คือการใช้คลาสผู้สร้าง [ต้องการอ้างอิง]

- จากBuilder PatternบนWikipediaโดยผู้มีส่วนร่วมหลายคน

ดังนั้นอย่างที่เราเห็นไม่มีความเข้าใจร่วมกันอย่างแท้จริงของรูปแบบที่ชื่อนี้อ้างถึงและในบางจุดคำจำกัดความที่แตกต่างกันแม้จะขัดแย้งกัน (เช่นเกี่ยวกับความเกี่ยวข้องของความหลากหลายของผู้สร้าง)

คุณสมบัติทั่วไปเพียงอย่างเดียวของStringBuilderพร้อมกับการตีความที่หลากหลายของรูปแบบคือผลิตภัณฑ์ถูกสร้างทีละขั้นตอนมากกว่าในครั้งเดียว ไม่เป็นไปตามการอ่านอย่างเข้มงวดเกี่ยวกับคำจำกัดความของ GoF ของรูปแบบการออกแบบ แต่โปรดทราบว่ารูปแบบการออกแบบนั้นเป็นแนวคิดที่มีความอ่อนไหวซึ่งหมายถึงการอำนวยความสะดวกในการสื่อสาร ฉันจะยังคงเรียกStringBuilderตัวอย่างของรูปแบบของตัวสร้างต่อไปแม้ว่าจะเป็นรูปแบบที่ผิดปกติ - เหตุผลหลักสำหรับโครงสร้างนั้นใน Java คือการเรียงต่อกันของนักแสดงต่อหน้าสตริงที่ไม่เปลี่ยนรูป แต่ไม่ใช่การออกแบบเชิงวัตถุที่น่าสนใจ


7
ฉันคิดว่าการสร้างวัตถุที่ไม่เปลี่ยนรูปแบบนั้นเป็นหนึ่งในการใช้งานทั่วไปของผู้สร้างฉันคิดว่านี่เป็นการแทนที่การใช้หลักตามที่อธิบายโดย GoF ดังนั้นยอมรับว่านี่เป็นตัวอย่างที่ดีที่สุดของรูปแบบ
จูลส์

เห็นด้วยกับการใช้งานในการสร้างกราฟที่ไม่เปลี่ยนรูปแบบ usecase สำหรับ Builder DSLs มีประโยชน์จริง ๆ สำหรับการสร้างกราฟขนาดใหญ่ของข้อมูลปลอม / ObjectMothers ระหว่างการทดสอบหน่วย + การรวมเข้าด้วยกัน
StuartLC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.