1
最近我已經瞭解了工廠和單例設計模式,並希望將它們一起實現。我遇到的問題是在單例類中定義的getInstance
方法必須是靜態的,那麼如何在接口中聲明此方法? Java 1.8允許在接口中使用靜態方法,但是這堅持認爲方法體是在實際接口中實現的 - 這立即從使用工廠單例的效率中減去。是否有可能從工廠創建單例實例
例如:
// File implementation of Logger (also a database implementation)
public class FileLogger implements Logger {
private static FileLogger instance;
private FileLogger() {
}
@Override
public static Logger getInstance() {
synchronized (FileLogger.class) {
if (instance == null) {
instance = new FileLogger();
}
}
return instance;
}
@Override
public void log(String message) {
System.out.println(new Date() + " " + message);
}
}
從工廠一樣:
// Factory pattern to create differing types of logger
public class LoggerFactory {
private LoggerFactory() {
}
public static Logger getLogger(LoggerType loggerType) {
Logger logger;
switch (loggerType) {
case DATABASE:
logger = DatabaseLogger.getInstance();
break;
default:
logger = FileLogger.getInstance();
}
return logger;
}
public enum LoggerType {
DATABASE, FILE;
}
}
希望這解釋了我的困境
// Logger.java (interface)
public interface Logger {
public Logger getInstance();
public static void log(String message);
}
時等實現產生錯誤。我得到的錯誤是missing method body
有沒有什麼辦法可以解決這個問題?
有沒有這樣的事情'靜態'接口方法。 –
爲什麼你需要接口上的靜態方法?你可以直接通過類型訪問靜態方法,所以你已經知道它是否有'getInstance'方法。您可以將'getInstance'方法作爲'LoggerType'枚舉上的'abstract'方法,這將消除您的switch語句。 –
從界面中刪除定義完全解決了我的問題。我在想你只能實現在界面中定義的方法?無論如何,歡呼聲。 – user2228313