สวัสดีทุกคน javaRush!
วันนี้จะมาเล่าถึงรูปแบบการออกแบบ
Singleton
(เดี่ยว) ครับ
เป้าหมาย:สร้างคลาสที่จะมีวัตถุเพียงอันเดียว ซึ่งหมายความว่าไม่ว่าจะมีการเข้าถึงกี่ครั้งก็ตาม ออบเจ็กต์เดียวกันกับที่สร้างขึ้นในครั้งแรกจะถูกส่งคืน นี่เป็นสิ่งที่สะดวกและจำเป็นในหลาย ๆ ที่ มันถูกนำไปใช้กับเฟรมเวิร์กไม่ใช่เพื่ออะไร
แอปพลิเคชัน:
- ตัวอย่างเช่น คุณต้องเชื่อมต่อฐานข้อมูลกับโปรเจ็กต์และคลาสที่จะรับผิดชอบในการเชื่อมต่อ การเชื่อมต่อถูกสร้างขึ้นเพียงครั้งเดียวและไม่จำเป็นต้องสร้างการเชื่อมต่อซ้ำแล้วซ้ำอีก
Application settings
— คลาสที่รับผิดชอบการตั้งค่าการเชื่อมต่อที่จำเป็นสำหรับแอปพลิเคชัน: โฮสต์ฐานข้อมูลและพอร์ต ฯลฯ สร้างขึ้นเพียงครั้งเดียวและใช้ตลอดการทำงานของแอปพลิเคชัน
- มีตัวอย่างอีกมากมายที่ฉันไม่ได้กล่าวถึง ดังนั้นเขียนตัวเลือกของคุณในความคิดเห็น! =)
หลังจากการแนะนำนี้ ตามที่ฉันเข้าใจ เราสามารถแสดงตัวอย่างของคลาสนี้ได้: (แม้ว่าฉันแน่ใจว่าเราแต่ละคนสามารถคิดการนำสิ่งนี้ไปใช้) นี่คือตัวอย่างที่ง่ายที่สุด เมื่อเราทำให้คอนสตรัคเตอร์เป็นแบบส่วนตัว เช่น คุณไม่สามารถสร้างวัตถุได้อย่างชัดเจน และมีวิธีการคงที่
getInstance()
ที่ให้วัตถุ
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
มีปัญหากับมัลติเธรด จากนั้นคุณสามารถใส่ เมธอด
getInstance()
marker
synchronized
:
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
ท้ายที่สุดแล้วเช่นเคยฉันอยากจะบอกว่าหากคุณคิดแตกต่างหรือพบข้อผิดพลาดในตัวฉันเขียนความคิดเห็นได้เลย! เราจะพูดคุยทุกอย่างด้วยความยินดี :) หากคุณชอบบทความนี้เขียน "+" แล้วฉันจะรู้ นี่เป็นสิ่งสำคัญสำหรับฉัน :) ป.ล. ฉันกำลังเพิ่มการใช้งานเพิ่มเติม: จากข้อมูลของ
Joshua Blochนี่เป็นวิธีที่ดีที่สุดในการใช้เทมเพลต
Enum Singleton
public enum Singleton {
INSTANCE;
}
Double Checked Locking & volatile
public class Singleton {
private static volatile Singleton instance;
public static Singleton getInstance() {
Singleton localInstance = instance;
if (localInstance == null) {
synchronized (Singleton.class) {
localInstance = instance;
if (localInstance == null) {
instance = localInstance = new Singleton();
}
}
}
return localInstance;
}
}
และต่อไป
On Demand Holder idiom
:
public class Singleton {
public static class SingletonHolder {
public static final Singleton HOLDER_INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.HOLDER_INSTANCE;
}
}
+
การเริ่มต้นแบบ Lazy
+
ประสิทธิภาพสูง
-
ไม่สามารถใช้กับฟิลด์คลาสที่ไม่คงที่ คำถาม/ข้อเสนอแนะใด ๆ - เขียนในความคิดเห็น!
ดูบทความอื่น ๆ ของฉันด้วย:
GO TO FULL VERSION