如何使用 lambda 表达式重构工厂 类?

How to refactor factory classes using lambda expressions?

一个常见的用例是定义某种工厂类:

public abstract class IFactory {
    public abstract Object getObject(String input);
}

实施工厂可能应该提供基于 input 的对象。

例如:

public class FactoryImpl {
    private static instance = null;

    public IFactory instance() {
        if (instance == null) {
            return new IFactory() {
                @Override
                public Object getObject(String input) {
                    return new Object(); //based on input data in real 
                }
            };
        }
    }
}

这很麻烦,所以我想用 lambda 表达式重构代码。 但首选方式是什么?

我可以想象以下两种选择:

public class FactoryImpl {
    public IFactory instance() {
        if (instance == null) {
            return (data) -> new Object(); //explicit using new operator
        }
    }
}

public class FactoryImpl {
    public IFactory instance() {
        if (instance == null) {
            IFactory factory = Object::new;
            return (data) -> factory.getObject(); //using method reference
        }
    }
}

有没有应该首选的方法(例如为了可读性或约定)?

你让你的生活变得不必要的复杂。

如果你interface喜欢

public interface IFactory {
    Object getObject(String input);
}

您可以将其实现为

public class NameIsIrrelevant {
    public IFactory instance() {
        return input -> new Object();
    }
}

没有考虑单例模式。虽然不能保证,但实现 确实 return 在这里是单例实现,因为它总是对非捕获 lambda 执行。

这不是铁一般的保证,但另一方面,如果 returned 实例不是单例也没有坏处……


这与您是否将使用 lambda 表达式或方法引用的问题无关。

如果你的工厂应该构建的类型有一个接受工厂输入作为参数值的构造函数,你可以将工厂实现为

public class NameIsIrrelevant {
    public IFactory instance() {
        return TheType::new;
    }
}

但这只是一个小的优化,或者更确切地说是一种风格选择;它不会以任何方式改变工厂的运作方式。如果没有这样的构造函数,无论如何尝试使用方法引用都是没有意义的。