ในช่วงสองสามเดือนที่ผ่านมาฉันสะดุดเทคนิค / รูปแบบต่อไปนี้สองสามครั้ง อย่างไรก็ตามฉันไม่สามารถหาชื่อเฉพาะได้และฉันก็ไม่แน่ใจ 100% เกี่ยวกับข้อดีและข้อเสียทั้งหมด
รูปแบบไปดังนี้:
ภายในอินเตอร์เฟส Java ชุดของวิธีการทั่วไปจะถูกกำหนดตามปกติ อย่างไรก็ตามการใช้คลาสภายในอินสแตนซ์เริ่มต้นจะถูกปล่อยออกมาผ่านส่วนต่อประสาน
public interface Vehicle {
public void accelerate();
public void decelerate();
public static class Default {
public static Vehicle getInstance() {
return new Car(); // or use Spring to retrieve an instance
}
}
}
สำหรับฉันดูเหมือนว่าข้อได้เปรียบที่ใหญ่ที่สุดคือความจริงที่ว่าผู้พัฒนาต้องการทราบเกี่ยวกับอินเทอร์เฟซไม่ใช่การใช้งานเช่นในกรณีที่เขาต้องการสร้างอินสแตนซ์อย่างรวดเร็ว
Vehicle someVehicle = Vehicle.Default.getInstance();
someVehicle.accelerate();
นอกจากนี้ฉันได้เห็นเทคนิคนี้ถูกใช้ร่วมกับ Spring เพื่อให้อินสแตนซ์แบบไดนามิกขึ้นอยู่กับการกำหนดค่า ในเรื่องนี้ดูเหมือนว่าสิ่งนี้สามารถช่วยในการทำให้เป็นโมดูลได้
อย่างไรก็ตามฉันไม่สามารถสั่นคลอนความรู้สึกว่านี่เป็นการใช้อินเทอร์เฟซในทางที่ผิดเนื่องจากมันเข้าคู่กับอินเตอร์เฟสกับการใช้งานอย่างใดอย่างหนึ่ง (หลักการผกผันพึ่งพา ฯลฯ .. )สามารถใครกรุณาอธิบายให้ฉันว่าเทคนิคนี้เรียกว่ารวมทั้งข้อดีและข้อเสียของมัน?
ปรับปรุง:
หลังจากผ่านไประยะหนึ่งเพื่อพิจารณาฉันตรวจสอบอีกครั้งและสังเกตว่ารูปแบบซิงเกิลต่อไปนี้ถูกใช้บ่อยกว่า ในรุ่นนี้อินสแตนซ์สาธารณะแบบคงที่จะถูกเปิดเผยผ่านทางอินเทอร์เฟซซึ่งจะเริ่มต้นได้เพียงครั้งเดียว นอกจากนี้อินสแตนซ์จะถูกเรียกคืนเกือบตลอดเวลาโดยใช้ Spring หรือโรงงานทั่วไปซึ่งแยกอินเทอร์เฟซออกจากการใช้งาน
public interface Vehicle {
public void accelerate();
public void decelerate();
public static class Default {
public static final Vehicle INSTANCE = getInstance();
private static Vehicle getInstance() {
return new Car(); // or use Spring/factory here
}
}
}
// Which allows to retrieve a singleton instance using...
Vehicle someVehicle = Vehicle.Default.INSTANCE;
โดยสรุป:ดูเหมือนว่านี่เป็นรูปแบบซิงเกิล / โรงงานที่กำหนดเองซึ่งโดยทั่วไปจะอนุญาตให้เปิดเผยอินสแตนซ์หรือซิงเกิลตันผ่านอินเทอร์เฟซของมัน ด้วยความเคารพต่อข้อเสียมีเพียงไม่กี่คนที่ได้รับการเสนอชื่อในคำตอบและความคิดเห็นด้านล่าง จนถึงตอนนี้ข้อได้เปรียบดูเหมือนจะอยู่ในความสะดวกสบายของมัน
Vehicle.Default
ควรจะย้ายขึ้นไป namespace VehicleFactory
แพคเกจเป็นชั้นโรงงานเช่น
Vehicle.Default.getInstance() != Vehicle.Default.getInstance()