是否有可能从工厂创建单例实例

问题描述:

最近我已经了解了工厂和单例设计模式,并希望将它们一起实现。我遇到的问题是在单例类中定义的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

我不知道我完全理解你的问题,但你可以做这样的事情,让工厂“生产”单身人士。

您正在寻找的工厂通常是特定界面的实例。从工厂方法的调用者的角度来看,无论是否是单例都是无关紧要的。所以我定义一个接口为这样:

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

有了这个您的工厂为您提供了正确的实现取决于你输入的接口(可能是你在你的问题,而不是整数使用的类型类)和一些(或所有如果你愿意)可以是单身人士。