2010-03-04 57 views
3

我目前将所有的游戏代码移动到另一个包中,以便在创建另一个类似的游戏时可以简单地重用它。接口,静态类问题

虽然我有这个问题。

public interface Sprite { 
... 
} 

abstract class AbstractSprite implements Sprite { 
... 
} 

public interface Builder<T> { 
    public T build(); 
} 

class GameObjectImpl extends AbstractSprite { 
    public static class GameObjectBuilder implements Builder<GameObjectImpl> { 
    ... 
    } 
} 

我正在使用Builder模式创建我的GameObjectImpl对象。然而,客户(使用我的游戏引擎的人)只能访问Sprite界面。

我怎样才能在客户端使用的建设者和只具有访问雪碧接口来创建GameObjectImpl?

回答

2

你可以在同一封装内增加一个公开可见的类名为建设者:

public final class Builders { 

    public static Builder<? extends Sprite> newGameObjectBuilder() { 
     return new GameObjectImpl.GameObjectBuilder(); 
    } 

} 
+0

这看起来可能会伎俩,我会放弃它。 – jax 2010-03-04 03:44:48

0

为什么生成器需要是一个接口?为什么不建造一个建造者般的工厂呢?看起来你想将接口与这个特定的实现联系起来。

public final class SpriteBuilder { 
    private final Foo foo; 
    private int property = 0; 

    public SpriteBuilder(Foo importantMandatoryValue) { 
    this.foo = importantMandatoryValue; 
    } 

    public SpriteBuilder setProperty(int theProperty) { 
    this.property = property; 
    return this; 
    } 

    public Sprite build() { 
    return new GameObjectImpl(foo, property); 
    } 
} 

你可以称呼SpriteBuilder一个GameObjectImplFactory ...并作出类似的类为您Sprite实现的每一个。你只需要确保他们只会返回Sprite类型。

在你的榜样,你实际上这样说public class GameObjectImplFactory implements Builder<Sprite>

希望这有助于和有道理:-)。

+0

客户端将构建自己的精灵,所以我不会给他们任何预先配置的精灵 – jax 2010-03-04 03:40:41

+0

我的例子中有什么预先配置的精灵?你说客户需要使用生成器吗?我的观点是你为他们提供了一个只返回一个Sprite的构建器(意味着他们必须遵守Sprite接口......并且你可以使你的实现包隐私)。那有意义吗? – Tom 2010-03-04 04:14:24

+0

好的,我错过了 – jax 2010-03-04 16:21:16

0

我不认为你会想让Builder类通用...而是Builder.build()应该返回一个Sprite对象。现在build()方法返回T这在你的情况下是GameObjectImpl