2016-12-26 1 views
1

최근에 팩토리 및 싱글 톤 디자인 패턴을 배웠고 함께 구현하려고합니다. 내가 겪고있는 문제는 싱글 톤 클래스에 정의 된 getInstance 메서드가 정적이어야하므로 인터페이스에서이 메서드를 어떻게 선언 할 수 있습니까? Java 1.8은 인터페이스 내에서 정적 메서드를 허용했습니다. 그러나은 메서드 본문이 실제 인터페이스 내에서 구현된다는 것을 강조합니다. 즉, 팩터 리에서 싱글 톤을 사용하는 효율성을 즉시 차감합니다. 희망팩토리에서 생성 된 싱글 톤 인스턴스를 가질 수 있습니까?

// 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; 
    } 
} 

이 내 처지를 설명 : 같은 공장에서

// 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); 

} 

오류가 발생합니다. 내가 얻는 오류는 missing method body

이 문제를 해결할 수있는 방법이 있습니까?

+0

'정적'인터페이스 방법은 없습니다. –

+0

왜 인터페이스에'static' 메소드가 필요한가요? 정적 메서드는 해당 형식을 통해 직접 액세스하므로'getInstance' 메서드가 있는지 이미 알고 있습니다. 대신에'getInstance' 메쏘드를'LoggerType' 열거 형에'abstract' 메쏘드로 놓을 수 있습니다. 그것은 당신의 switch 문을 제거 할 것입니다. –

+0

인터페이스에서 정의를 제거하면 문제가 완전히 해결되었습니다. 인터페이스에 정의 된 메서드 만 구현할 수 있다고 생각했습니다. 어쨌든 건배. – user2228313

답변

0

나는 당신의 질문을 완전히 이해하고 있는지 확신 할 수 없지만, 공장에서 "싱글"을 생성하기 위해 이렇게 할 수있다.

팩토리로 찾고있는 것은 일반적으로 특정 인터페이스의 인스턴스입니다. 그것이 싱글 톤인지 아닌지는 팩토리 메서드의 호출자의 관점에서 볼 때 무의미합니다. 그래서 나는 그래서 인터페이스를 정의하는 것 :

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 interface InterestingInterface { 
    public void print(); // my interesting method that I need all 
         // "products to implement" 
} 

그리고 내 수업을 인스턴스화 할 구현 클래스와이를 수행하는 방법을 알고 있어야합니다. 이 경우에는 다음과 같이 수 :

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보다 더 귀하의 질문에 사용될 수있는) 일부를 구현 (또는 원하는 모든 경우)은 싱글 톤일 수 있습니다.

관련 문제