抽象工厂实施

时间:2010-07-01 15:55:09

标签: java design-patterns abstract-factory

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

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的值应该是未定义的,直到构造函数的执行返回。

谢谢, 唐

1 个答案:

答案 0 :(得分:2)

关于从构造函数

泄漏this
  

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

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

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

关于您的设计

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

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

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