Son birkaç ay boyunca, aşağıdaki tekniği / kalıbı birkaç kez tökezledim. Ancak, belirli bir isim bulamıyorum, ne de tüm avantaj ve dezavantajlarından% 100 emin değilim.
Desen aşağıdaki gibi gider:
Bir Java arayüzünde, her zamanki gibi bir dizi ortak yöntem tanımlanır. Bununla birlikte, bir iç sınıf kullanıldığında, arabirimden varsayılan bir örnek sızdırılır.
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
}
}
}
Benim için en büyük avantaj, bir geliştiricinin sadece bir örnek oluşturmak istediği durumlarda, örneğin arayüzü hakkında değil uygulamaları hakkında bilmesi gerektiği gerçeğinde görünüyor.
Vehicle someVehicle = Vehicle.Default.getInstance();
someVehicle.accelerate();
Ayrıca, bu tekniğin, yapılandırmaya bağlı olarak dinamik olarak örnekler sağlamak amacıyla Spring ile birlikte kullanıldığını gördüm. Bu bakımdan, modülerleşmeye de yardımcı olabileceği gözüküyor.
Yine de, arayüzü uygulamalardan biriyle eşleştirdiği için bunun arayüzün kötüye kullanımı olduğu hissini sallayamıyorum. (Bağımlılık inversiyon ilkesi vb.) Herhangi biri bana bu tekniğin nasıl adlandırıldığını, avantajlarını ve dezavantajlarını açıklayabilir mi?
Güncelleştirme:
Bir süre göz önünde bulundurulduktan sonra, desenin aşağıdaki singleton versiyonunun çok daha sık kullanıldığını tekrar kontrol ettim ve fark ettim. Bu versiyonda, genel statik bir örnek yalnızca bir kez başlatılan arayüzden (alanın nihai olması nedeniyle) ortaya çıkar. Buna ek olarak, örnek hemen hemen her zaman Bahar veya uygulamadan arayüzü ayıran jenerik bir fabrika kullanılarak alınır.
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;
Özetle: Bunun temelde bir örneği veya bir singletonu arayüzü aracılığıyla göstermesini sağlayan özel bir singleton / fabrika modeli olduğu görülüyor. Dezavantajları ile ilgili olarak, aşağıdaki cevap ve yorumlarda birkaç kişi isimlendirilmiştir. Şimdiye kadar, avantaj kolaylık olarak görünüyor.
Vehicle.Default
bir fabrika sınıfı olarak paket isim alanına taşınmalıdır, örn VehicleFactory
.
Vehicle.Default.getInstance() != Vehicle.Default.getInstance()