首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抽象工厂实现

抽象工厂实现
EN

Stack Overflow用户
提问于 2010-07-01 23:55:09
回答 1查看 670关注 0票数 1

我实现了一个抽象工厂,如下所示

代码语言:javascript
复制
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的值似乎是未定义的。

谢谢,唐

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-02 00:00:12

关于从构造函数泄漏this

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

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

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

关于你的设计

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3159494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档