รูปแบบตัวสร้าง

รูปแบบตัวสร้างช่วยให้สามารถสร้างวัตถุที่ซับซ้อนในลักษณะขั้นตอนได้

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

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

class House {  
  constructor(walls, pool, roof, garden, internet, ...) {...}
}

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

รูปแบบตัวสร้างเพื่อช่วยเหลือ! รูปแบบตัวสร้างแนะนำให้คุณแยกส่วนประกอบของบ้านออกเป็นคลาสใหม่ สำหรับกรณีการใช้งานของเรา ขอเรียกมันว่า HouseBuilder (เซอร์ไพรส์!) จากนั้นเราจะเพิ่มคุณสมบัติทั้งหมดเป็นวิธีการใน HouseBuilder เราจะเพิ่ม addPools(), addGardens(), addInternet(), addWalls(), addRoof() ฯลฯ หลังจากที่เราเพิ่มวิธีการเหล่านั้นทั้งหมดแล้ว เราจำเป็นต้องเพิ่มวิธี getHouse() เพื่อดึงข้อมูลบ้านที่สร้างขึ้น สิ่งสำคัญที่ควรทราบคือคุณจะต้องรีเซ็ตตัวสร้างหลังจากที่คุณรับผลิตภัณฑ์แล้ว โดยปกติแล้ว การดำเนินการนี้จะกระทำโดยใช้เมธอด getHouse() อย่างไรก็ตาม คุณสามารถเรียกได้จากที่อื่นด้วยตนเอง

ลองมาดูตัวอย่างโค้ดที่มีการใช้งานขั้นพื้นฐานกัน

และที่นั่นเรามีมัน บ้านที่สวยงาม

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

และนั่นก็คือ ผู้กำกับที่ทำทุกอย่างเพื่อคุณ ตอนนี้มีข้อดีและข้อเสียบางประการ

ข้อดี:

  • คุณควบคุมการสร้างวัตถุ ทีละขั้นตอน
  • ยึดหลักความรับผิดชอบเดียว

ข้อเสีย:

  • การใช้รูปแบบนี้กับการใช้งานแบบง่ายสามารถทำให้โค้ดซับซ้อนเกินความจำเป็นอย่างเคร่งครัด

นั่นคือทั้งหมดสำหรับรูปแบบตัวสร้าง ในบทความถัดไป ฉันจะพูดถึงรูปแบบการออกแบบของ Factory (อย่าสับสนกับรูปแบบ Abstract Factory) แล้วพบกันใหม่!