【问题标题】:abstract factory implementation抽象工厂实现
【发布时间】:2010-07-01 15:55:09
【问题描述】:

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

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 的值似乎应该是未定义的。

谢谢, 唐

【问题讨论】:

    标签: java design-patterns abstract-factory


    【解决方案1】:

    关于从构造函数中泄露this

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

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

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

    关于您的设计

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

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

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

    【讨论】:

    • 不,它真的是一个产品工厂,目录有点用词不当,所以我把它删除了
    猜你喜欢
    • 1970-01-01
    • 2018-08-12
    • 2016-03-31
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多