Java:我被单例工厂困住了,想改进我的方法

Java: I'm stuck on singleton factories, and want to evolve my approach

所以,这是一个非常高级的问题,涉及我多年来的工作方式。我知道我的方法可以改进,我正在寻找(或 "the")正确/更好的方法来生成工厂。

很长一段时间以来,我的大脑一直在写单例工厂。这是工厂的基本伪代码:

public Factory { 
     private static final INSTANCE = new Factory();

     private Factory () {}

     public static Factory instance() { 
         return INSTANCE;
     }        

     public Object createStuff() {
        // impl specific factory details here
        return null;
     }
 }

现在,这种方法让我在代码的其他地方变得非常懒惰,而不必到处维护工厂实例。不过,我最近加强了我的单元测试游戏,并且 运行 遇到了出于测试目的模拟工厂的问题,这让我质疑我的方法。

我听说依赖注入可能是一个不错的方法,我愿意对此进行调查。我目前的一些项目已经走得太远,无法调整和引入新方法(因此,现有的东西没有依赖注入)。

所以,底线:什么是更好的方法,无论有没有依赖注入?

谢谢! 罗布

你喜欢 Spring(使用 Spring 启动)吗?

它开始成为轻量级 Java 应用程序的实际标准。 它可以大大减少您开发功能齐全的生产应用程序所需的代码量。

为了使用 DI 并使依赖于工厂的 类 可测试,您需要让工厂实现一个接口,然后让使用工厂的 类 需要一个那些 类 的构造函数中的工厂实例。然后,这将允许您通过提供也实现接口的存根或模拟工厂来测试那些 类。

像这样

public interface IFactory
{
    object createInstance;
}

public class ClassWithDependencyOnFactory
{
     private IFactory factory;
     public ClassWithDependencyOnFactory(IFactory factory)
     {
        this.factory = factory;
     }

     public void DoSomething()
     {
         var thing = factory.createInstance();
         ...
     }
}

不要假设您需要使用 IoC 框架(如 Spring)来进行 DI 或获得它带来的解耦的好处。