我想实现一个抽象工厂的例子,但是具体的工厂必须作为单身人士。
以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();
}
这似乎有点奇怪,我认为我没有在正确的课程中应用所需的修改。如果我完全错了,请你给我一个简短的解释(为什么我错了,我必须修改哪个类以及为什么?)
提前致谢。
答案 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意义上)通常意味着“唯一的”。更好的只是“实例”。如果你的想法是让两个单身人士在某个地方闲逛,但他们是不同的,你可以将它们命名为ufoBossInstance
和ufoGruntInstance
,例如在引用页面的命名之后。