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 或获得它带来的解耦的好处。
所以,这是一个非常高级的问题,涉及我多年来的工作方式。我知道我的方法可以改进,我正在寻找(或 "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 或获得它带来的解耦的好处。