2016-12-26 14 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); 
    } 

} 

::のように実装する際

// Logger.java (interface) 
public interface Logger { 

    public Logger getInstance(); 
    public static void log(String 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; 
    } 
} 

うまくいけば、これは私の苦境を説明します。私が得ているエラーはmissing method body

これを解決する方法はありますか?

+0

静的なインターフェースメソッドはありません。 –

+0

なぜインターフェース上に 'static'メソッドが必要でしょうか?静的メソッドにはその型から直接アクセスするので、 '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; 
     } 
    } 
} 
あなたの工場は、あなたの入力に応じて、インターフェイスの正しい実装を提供します。これにより

(型クラスは、あなたではなくint型よりもあなたの質問に使用することができる)と、いくつかのの実装(またはあなたが望むならばすべて)はシングルトンにすることができます。

関連する問題