Java抽象工厂和单身人士

时间:2014-11-15 23:20:46

标签: java design-patterns singleton factory-pattern

我想实现一个抽象工厂的例子,但是具体的工厂必须作为单身人士。

以Banas先生为例:http://www.newthinktank.com/2012/09/abstract-factory-design-pattern/我应该修改UFOEnemyShipFactory和UFOBossEnemyShipFactory吗?

我为UFOEnemyShipFactory尝试了一些东西,但我不确定是对的:

public class UFOEnemyShipFactory implements EnemyShipFactory{

    private UFOEnemyShipFactory(){};

    private static UFOEnemyShipFactory firstInstance = null;

    public static UFOEnemyShipFactory getInstance(){

        if(firstInstance == null){

            synchronized(UFOEnemyShipFactory.class){

                if(firstInstance == null){

                    firstInstance = new UFOEnemyShipFactory();

                }

            }

        }

        return firstInstance;

    }

    public ESWeapon addESGun(){
        return new ESUFOGun();
    }

    public ESEngine addESEingine() {
        return new ESUFOEngine();
    }

这似乎有点奇怪,我认为我没有在正确的课程中应用所需的修改。如果我完全错了,请你给我一个简短的解释(为什么我错了,我必须修改哪个类以及为什么?)

提前致谢。

1 个答案:

答案 0 :(得分:0)

我担心我没有关于您的AbstractFactory问题的完整信息,但我可以帮助您解决单身人士问题......

通常在尝试单例设计模式时,指定私有构造函数,以便其他人不能使用默认构造函数来创建自己的实例。

作为一个额外的观察,你已经直接进入经典的“复核”反模式(不做的事情)。我在这里写了更多内容:What's wrong with the following getInstance() method 基本上,不要在同步块外检查,同步,然后再次检查。看起来它是安全的,但事实并非如此。为此:

public static UFOEnemyShipFactory getInstance(){
    if(firstInstance == null){
        synchronized(UFOEnemyShipFactory.class){
            if(firstInstance == null){
                firstInstance = new UFOEnemyShipFactory();
            }
        }
    }
    return firstInstance;
}

写下这个:

public static synchronized UFOEnemyShipFactory getInstance(){
    if(firstInstance == null){
                firstInstance = new UFOEnemyShipFactory();
    }
    return firstInstance;
}

或许多人会说更好:

private static final UFOEnemyShipFactory firstInstance = new UFOEnemyShipFactory();

public static UFOEnemyShipFactory getInstance(){
    return firstInstance;
}

也是一个风格点。理论上你可以按照自己的意愿命名,“firstInstance”会引发问题。有没有“secondInstance”?但是,“实例”(至少在java意义上)通常意味着“唯一的”。更好的只是“实例”。如果你的想法是让两个单身人士在某个地方闲逛,但他们是不同的,你可以将它们命名为ufoBossInstanceufoGruntInstance,例如在引用页面的命名之后。