我有一組單例類,我想避免樣板代碼。以下是我現在有:繼承的Java單例
public class Mammal {
protected Mammal() {}
}
public class Cat extends Mammal {
static protected Cat instance = null;
static public Cat getInstance() {
if (null == instance) {
instance = new Cat();
}
return instance;
}
private Cat() {
// something cat-specific
}
}
這工作有什麼不妥的,但我有很多Mammal
子類必須複製getInstance()
方法。如果可能的話,我寧願像這樣的東西:
public class Mammal {
protected Mammal() {}
static protected Mammal instance = null;
static public Mammal getInstance() {
if (null == instance) {
instance = new Mammal();
}
return instance;
}
}
public class Cat extends Mammal {
private Cat() {
// something cat-specific
}
}
我該怎麼做?
你單身getInstance()方法是不是正確實施 - 在多線程環境中,你可以最終創建多個實例! – Liv 2011-06-10 15:58:29
不是你的問題的答案,但你的單身模式不是線程安全的。有[Java併發實踐]中的示例(http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601)。 – Bruno 2011-06-10 16:00:40
單身真的是最好的方法嗎?單身人士最好用來表示服務或其他真實世界中只有一個實例的東西。確保這種模式非常適合你的應用領域,因爲我會假設你的代碼並不真正使用貓和狗。如果單身人士合適,我建議使用Jim Garrison的使用Spring的解決方案;春季豆類默認爲單身。 – 2011-06-10 16:56:45