1

我已经实现了一个像这样的抽象工厂

public abstract class AbstractFactory {

    private static final Map FACTORIES = new HashMap();    

    AbstractFactory(FactoryType type) {
        FACTORIES.put(type, this);
    }   

    public abstract A getA();

    public abstract B getB();

    public static AbstractCatalogFactory getFactory(FactoryType type) {
        return (AbstractCatalogFactory) FACTORIES.get(type);
    }
}

具体工厂必须调用此抽象工厂构造函数,导致每个具体实现都在FACTORIES映射中注册。我有点担心在构造函数中引用this,因为在构造函数的执行返回之前,它的值似乎this应该是未定义的。

谢谢,唐

4

1 回答 1

2

this关于从构造函数中泄漏

我有点担心在构造函数中引用this,因为在构造函数的执行返回之前,它的值似乎this应该是未定义的。

更准确地说,在构造函数完成之前,this引用不应从构造函数泄漏到外部方。否则,外部方最终可能会调用尚未完成的新对象上的方法。

您的实现有可能发生这种情况,因为this它已添加到地图中,外部各方可以通过静态方法访问该地图getInstance。补救措施可能是同步对地图的访问。另一种选择(正如 Josh Bloch 在 Effective Java 中所讨论的)是将任何具体子类中的构造函数设为私有,并在每个子类中使用静态工厂方法来构造对象,然后将其添加到映射中。不过,这会导致一些代码重复。

关于您的设计

显然,您正在实施“工厂目录”而不是“产品工厂”,因此这与经典的Abstract Factory完全不同。没有更多细节,很难判断这是否合理。

主要问题是在这里你统一了工厂接口和工厂“存储”,这在 IMO 不是一个好主意。工厂的客户应该只看到工厂接口及其getX方法,而不应该知道他们实际使用的具体工厂(更不用说自己选择了)。

此外,通常在任何给定时间都只有一个具体的产品系列在使用,因此只需要一种具体的工厂。这消除了混合来自不同混凝土产品系列的不兼容产品的可能性。您当前的设计似乎允许这样做,这对我来说不是一个好兆头-但也许您对此有充分的理由...

于 2010-07-01T16:00:11.933 回答