是否有可能从工厂创建单例实例
问题描述:
最近我已经了解了工厂和单例设计模式,并希望将它们一起实现。我遇到的问题是在单例类中定义的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
有没有什么办法可以解决这个问题?
答
我不知道我完全理解你的问题,但你可以做这样的事情,让工厂“生产”单身人士。
您正在寻找的工厂通常是特定界面的实例。从工厂方法的调用者的角度来看,无论是否是单例都是无关紧要的。所以我定义一个接口为这样:
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;
}
}
}
有了这个您的工厂为您提供了正确的实现取决于你输入的接口(可能是你在你的问题,而不是整数使用的类型类)和一些(或所有如果你愿意)可以是单身人士。
有没有这样的事情'静态'接口方法。 –
为什么你需要接口上的静态方法?你可以直接通过类型访问静态方法,所以你已经知道它是否有'getInstance'方法。您可以将'getInstance'方法作为'LoggerType'枚举上的'abstract'方法,这将消除您的switch语句。 –
从界面中删除定义完全解决了我的问题。我在想你只能实现在界面中定义的方法?无论如何,欢呼声。 – user2228313