如何基于java中的属性文件调用singleton类的实例?

如何基于java中的属性文件调用singleton类的实例?,java,properties,junit,singleton,instance,Java,Properties,Junit,Singleton,Instance,我有一个简单的Java问题。哦,我对Java和stackoverflow都是新手,所以请考虑一下:) 让我试着更好地解释我的问题。所以我有两个类遵循单例模式,比如a类和B类: public class A { private static final A INSTANCE = new A() public static A getInstance() { return A.INSTANCE; } } public class B {

我有一个简单的Java问题。哦,我对Java和stackoverflow都是新手,所以请考虑一下:)

让我试着更好地解释我的问题。所以我有两个类遵循单例模式,比如a类和B类:

public class A
{
    private static final A INSTANCE = new A()

    public static A getInstance()
    {
         return A.INSTANCE;
    }
}

public class B
{
    private static final B INSTANCE = new B()

    public static B getInstance()
    {
         return B.INSTANCE;
    }
}
现在我从另一个类访问这些类的实例,比如说C:

public class testClassC
{
    A class_instance = A.getInstance();
    //or
    //B class_instance = B.getInstance();
}
我试图实现的是(此时语法可能完全错误,我一直在尝试不同的事情,但没有一件对我有效):

有一个.properties文件,如下所示:

 className=A
然后以某种方式从属性文件中读取类名,这样当我将A更改为B时,我的testClassC将获得B的一个实例

我怎样才能做到这一点?哦,testClassC是一个测试类,我有一大堆JUnit测试类,那么最好的方法是什么呢


谢谢

下面是一个使用抽象工厂模式的示例

您有一个
接口
,它定义了您的类-您需要这个接口,以便可以抽象实际的实现

然后有一个工厂接口,它定义了
newInstance
方法。这使得将单例模式替换为工厂模式非常容易。它还可以轻松地更改工厂实现以进行测试

interface MyInterface {
}

interface MyInterfaceFactory {

    MyInterface newInstance();
}

class MyInterfaceFactoryFromProperties implements MyInterfaceFactory {

    final Class<? extends MyInterface> myInterfaceImpl;

    {
        final Properties properties = new Properties();
        try {
            properties.load(MyInterfaceFactoryFromProperties.class.getResourceAsStream("className.properties"));
        } catch (IOException ex) {
            throw new ExceptionInInitializerError(ex);
        }
        final String className = properties.getProperty("class.name");
        try {
            myInterfaceImpl = (Class<? extends MyInterface>) MyInterfaceFactoryFromProperties.class.forName(className);
        } catch (ClassNotFoundException ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    @Override
    public MyInterface newInstance() {
        try {
            return myInterfaceImpl.newInstance();
        } catch (InstantiationException ex) {
            throw new RuntimeException(ex);
        } catch (IllegalAccessException ex) {
            throw new RuntimeException(ex);
        }
    }
}
接口MyInterface{
}
接口MyInterfaceFactory{
MyInterface newInstance();
}
类MyInterfaceFactoryFromProperties实现MyInterfaceFactory{

最后一个类您希望它有多大的灵活性?如果您不太关心如何使它灵活,您可以创建一个映射来存储该类的名称以及该类的单例。@RobWatts我将在哪里存储该映射对象?基本上我有三种类型的存储类:RAM、XML和SQL。然后我有测试类它测试我的存储。我想做的是有一个属性文件,我可以在其中将类名更改为RAM,我的测试类将创建一个RAM存储类的实例,并对其进行测试。您应该阅读依赖项注入,因为这正是您要找的。这是一个覆盖Spring DI。您应该仔细阅读广告,尤其是第6章。我认为Spring可能有些过火了。我会选择——它的重量稍微轻一点。也要感谢所有其他的响应者,是的,我会读到依赖注入。我们在速成班上简要介绍了它,但从来没有真正强调过。我想我会很快发现它的作用。