工厂模式中的资源泄漏

时间:2020-05-24 10:18:50

标签: java factory resource-leak

假设您有一个实现Car的{​​{1}}类。构造函数采用AutoCloseable对象,该对象在汽车关闭时需要停止。

Engine

class Car implements AutoCloseable { final Engine engine; Car(final Engine engine) { this.engine = engine; } @Override public void close() { engine.stop(); } } 首先初始化一个引擎,然后使用它来构造一辆新车。

CarFactory

确保在try-with-resources语句中将汽车关闭。

class CarFactory
{
    public Car createCar()
    {
        // Initialize resources
        final Engine engine = new Engine();
        engine.start();

        // Pass them to a closeable object
        return new Car(engine);
    }
}

但是如果try (final Car car = carFactory.createCar()) { // drive around } 引发异常怎么办?然后工厂调用永远不会完成,引擎不会停止,因此它占用的资源也不会释放。

现在,我通常的解决方法是将整个初始化逻辑移出工厂方法,并移入try-with-resources块:

Engine#start()
class CarFactory
{
    public Car createCar()
    {
        return new Car(new Engine());
    }
}

但是,这导致了很多重复的代码,尤其是当不同的汽车实现共享相似的初始化逻辑时。除此之外,还感觉不对。我希望初始化会在工厂进行。您能帮我找到一个更好的解决方案吗?

0 个答案:

没有答案