2016-12-26 76 views
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

有沒有什麼辦法可以解決這個問題?

+0

有沒有這樣的事情'靜態'接口方法。 –

+0

爲什麼你需要接口上的靜態方法?你可以直接通過類型訪問靜態方法,所以你已經知道它是否有'getInstance'方法。您可以將'getInstance'方法作爲'LoggerType'枚舉上的'abstract'方法,這將消除您的switch語句。 –

+0

從界面中刪除定義完全解決了我的問題。我在想你只能實現在界面中定義的方法?無論如何,歡呼聲。 – user2228313

回答

0

我不知道我完全理解你的問題,但你可以做這樣的事情,讓工廠「生產」單身人士。

您正在尋找的工廠通常是特定界面的實例。從工廠方法的調用者的角度來看,無論是否是單例都是無關緊要的。所以我定義一個接口爲這樣:

public interface InterestingInterface { 
    public void print(); // my interesting method that I need all 
         // "products to implement" 
} 

然後我的類實現該接口可以是單身與否取決於他們的目的,所以:

public class SingletonA implements InterestingInterface { 

    private static SingletonA instance = null; 

    private SingletonA(){} 

    public static SingletonA getInstance() { 
     if (instance == null) { 
      instance = new SingletonA(); 
     } 

     return instance; 
    } 

    @Override 
    public void print() { 
     System.out.println("I am A"); 
    } 
} 

class SingletonB implements InterestingInterface { 
    private static SingletonB instance = null; 

    private SingletonB(){} 

    public static SingletonB getInstance() { 
     if (instance == null) { 
      instance = new SingletonB(); 
     } 

     return instance; 
    } 

    @Override 
    public void print() { 
     System.out.println("I am B"); 
    } 
} 

public class C implements InterestingInterface { 
    @override 
    public void print() { 
     System.out.println("I am C"); 
    } 
} 

工廠的責任知道哪個實現類實例化以及如何實現。在這種情況下,它可能看起來像這樣:

public class SingletonFactory { 
    public static InterestingInterface produce(int id) { 
     switch(id) { 
      case 1: 
       return SingletonA.getInstance(); 
      case 2: 
       return SingletonB.getInstance(); 
      case 3: 
       return new C(); 
      default: 
       return null; 
     } 
    } 
} 

有了這個您的工廠爲您提供了正確的實現取決於你輸入的接口(可能是你在你的問題,而不是整數使用的類型類)和一些(或所有如果你願意)可以是單身人士。

相關問題