บทความนี้มุ่งเป้าไปที่ใครก็ตามที่พบกับแนวคิดของรูปแบบการออกแบบเป็นครั้งแรก เคยได้ยินคำว่าsingletonหรือนำรูปแบบ singleton มาใช้แต่ไม่เข้าใจว่าเกิดอะไรขึ้น ยินดีต้อนรับ! นักเรียน CodeGym พบกับรูปแบบการออกแบบเป็นครั้งแรกในระดับ 15 เมื่อกัปตันขอให้พวกเขา "เสริม" ความเข้าใจโดยไม่คาดคิดโดยการนำรูปแบบ Java Singleton ไปใช้โดยไม่ได้ตั้งใจ นักเรียนที่ได้ยินเกี่ยวกับ รูปแบบ ซิงเกิลตันเป็นครั้งแรกจะมีคำถามมากมายในทันทีว่ารูปแบบการออกแบบคืออะไรในโลกนี้ ทำไมเราต้องการมัน? ซิงเกิลตันคืออะไร? และสุดท้าย การนำไปใช้อย่างขี้เกียจคืออะไร? มาตอบคำถามเหล่านี้ตามลำดับ
และ รูปแบบ ซิงเกิลตันเป็นเพียงหนึ่งในนั้น
ด้วยแบล็คแจ็คและตัวเลขและใช้เวลามากในการทำเช่นนั้น หรือคุณสามารถนำสิ่งที่เข้าใจและอธิบายไว้นานแล้วไปปฏิบัติ เช่นเดียวกับรูปแบบการออกแบบ นอกจากนี้ ด้วยรูปแบบการออกแบบ โค้ดจะกลายเป็นมาตรฐานมากขึ้น และเมื่อใช้รูปแบบที่เหมาะสม คุณจะมีโอกาสทำผิดพลาดน้อยลง เนื่องจากข้อผิดพลาดทั่วไปของรูปแบบนั้นถูกระบุและกำจัดไปนานแล้ว เหนือสิ่งอื่นใด ความรู้เกี่ยวกับรูปแบบช่วยให้โปรแกรมเมอร์เข้าใจซึ่งกันและกันได้ดีขึ้น คุณสามารถพูดชื่อของรูปแบบแทนการพยายามให้คำอธิบายที่ยืดยาวแก่เพื่อนโปรแกรมเมอร์ของคุณ สรุป รูปแบบการออกแบบช่วยให้คุณ:
เพื่อสรุปส่วนนี้ เราทราบว่ารูปแบบการออกแบบทั้งหมดสามารถแบ่งออกเป็นสามกลุ่มใหญ่:
รูปแบบการออกแบบในโลกคืออะไร?
ฉันเชื่อว่าประวัติเล็กน้อยเพื่อตอบคำถามนี้ด้วยความเข้าใจที่ดีที่สุด มีผู้เขียนโปรแกรมที่มีชื่อเสียงสี่คน (Erich Gamma, John Vlissides, Ralph Johnson และ Richard Helm) ที่มาพร้อมกับแนวคิดที่น่าสนใจ พวกเขาสังเกตเห็นว่าการพัฒนาซอฟต์แวร์มักจะต้องแก้ปัญหาเดียวกันโดยประมาณและเขียนโค้ดที่มีโครงสร้างในลักษณะเดียวกัน ดังนั้นพวกเขาจึงตัดสินใจอธิบายรูปแบบทั่วไปที่มักต้องใช้ในการเขียนโปรแกรมเชิงวัตถุ หนังสือของพวกเขาได้รับการตีพิมพ์ในปี 1994 ภายใต้ชื่อ Design Patterns: Elements of Reusable Object-Oriented Software ชื่อหนังสือยาวเกินไปและผู้คนเริ่มเรียกง่ายๆ ว่าหนังสือเล่มนี้โดย Gang of Four รุ่นแรกมี 23 ลาย หลังจากนั้นก็มีการค้นพบรูปแบบอื่นๆ อีกหลายสิบรูปแบบรูปแบบการออกแบบเป็นวิธีแก้ปัญหาที่ได้มาตรฐานสำหรับปัญหาทั่วไป |
ทำไมเราต้องมีรูปแบบการออกแบบ?
คุณสามารถเขียนโปรแกรมได้โดยไม่ต้องรู้รูปแบบ เพราะเมื่อถึงระดับ 15 คุณได้เขียนโปรแกรมขนาดเล็กหลายร้อยโปรแกรมบน CodeGym โดยที่คุณไม่รู้ด้วยซ้ำว่ามีโปรแกรมเหล่านั้นอยู่ สิ่งนี้ชี้ให้เห็นว่ารูปแบบการออกแบบเป็นเครื่องมือประเภทหนึ่งที่การใช้งานทำให้ผู้เชี่ยวชาญแตกต่างจากมือสมัครเล่น: รูปแบบการออกแบบอธิบายวิธีแก้ปัญหาทั่วไปอย่างเหมาะสม ซึ่งหมายความว่าการรู้รูปแบบจะช่วยคุณประหยัดเวลา ด้วยวิธีนี้ พวกมันคล้ายกับอัลกอริทึม ตัวอย่างเช่น คุณสามารถสร้างอัลกอริทึมการเรียงลำดับของคุณเอง
|

ในที่สุดรูปแบบซิงเกิล
Singletonเป็น รูป แบบที่สร้างสรรค์ รูปแบบนี้ทำให้แน่ใจว่ามีเพียงหนึ่งอินสแตนซ์ของคลาสและจัดเตรียมจุดเชื่อมต่อส่วนกลางสำหรับออบเจกต์นี้ จากคำอธิบาย ควรชัดเจนว่าควรใช้รูปแบบนี้ในสองกรณี:- เมื่อโปรแกรมของคุณกำหนดให้สร้างออบเจกต์ของคลาสใดคลาสหนึ่งไม่เกินหนึ่งออบเจกต์ ตัวอย่างเช่น เกมคอมพิวเตอร์อาจมีคลาสฮีโร่และวัตถุฮีโร่เพียงชิ้นเดียวที่อธิบายฮีโร่ตัวเดียวในเกม
- เมื่อคุณต้องการระบุจุดสำหรับการเข้าถึงวัตถุทั่วโลก กล่าวอีกนัยหนึ่ง คุณต้องทำให้วัตถุพร้อมใช้งานจากทุกที่ในโปรแกรม อนิจจา การสร้างตัวแปรส่วนกลางเพียงอย่างเดียวนั้นไม่เพียงพอ เนื่องจากไม่มีการป้องกันการเขียน ทุกคนสามารถเปลี่ยนค่าของตัวแปรได้ ดังนั้นจุดเชื่อมต่อส่วนกลางของวัตถุอาจสูญหาย คุณสมบัติเหล่านี้ของSingletonมีความจำเป็น ตัวอย่างเช่น เมื่อคุณมีวัตถุที่ทำงานกับฐานข้อมูล และคุณจำเป็นต้องเข้าถึงฐานข้อมูลจากส่วนต่าง ๆ ของโปรแกรม Singleton จะทำให้แน่ใจว่าไม่มีใครเขียนโค้ดแทนที่อินสแตนซ์ที่สร้างไว้ก่อนหน้านี้
-
ค้นหาตัวอย่างของSingletonด้วยการเริ่มต้นแบบสันหลังยาว
-
สร้างคลาสซิงเกิลตันสามคลาส — Sun, Moon, Earth — ในไฟล์แยกกันโดยใช้หลักการเดียวกัน
-
ดำเนินการดาวเคราะห์อินเตอร์เฟสในคลาสSun , MoonและEarth
- ในบล็อกคงที่ของ คลาส Solutionให้เรียกอ่านคีย์จากคอนโซลและอินิตแพลนเน็ตวิธี.
-
ดำเนินการอ่านคีย์จากคอนโซลและอินิตแพลนเน็ตการทำงานของเมธอด:
-
5.1. อ่านหนึ่ง พารามิเตอร์ สตริงจากคอนโซล
-
5.2. ถ้าพารามิเตอร์มีค่าเท่ากับค่าใดค่าหนึ่งดาวเคราะห์ค่าคงที่ของอินเทอร์เฟซ สร้างวัตถุthePlanet ที่เหมาะสม
-
-
คุณต้องให้คลาสเป็นฟิลด์สแตติกส่วนตัวที่เก็บวัตถุเดียว:
public class LazyInitializedSingleton { private static LazyInitializedSingleton instance; // #1 }
-
ทำให้ตัวสร้าง (ค่าเริ่มต้น) เป็นส่วนตัว ซึ่งหมายความว่าไม่สามารถเข้าถึงได้นอกชั้นเรียนและจะไม่สามารถส่งคืนวัตถุใหม่ได้:
public class LazyInitializedSingleton { private static LazyInitializedSingleton instance; private LazyInitializedSingleton(){} // #2 }
-
ประกาศวิธีการสร้างแบบคงที่ที่จะใช้เพื่อรับซิงเกิลตัน:
public class LazyInitializedSingleton { private static LazyInitializedSingleton instance; private LazyInitializedSingleton() {} public static LazyInitializedSingleton getInstance() { // #3 if (instance == null) { // If the object has not yet been created instance = new LazyInitializedSingleton(); // Create a new object } return instance; // Return the previously created object } }
GO TO FULL VERSION