Java 接口、静态类问题

Java 接口、静态类问题,java,Java,我目前正在将我所有的游戏代码移到另一个包中,以便在创建另一个类似的游戏时可以简单地重用它 不过我在这方面有一些问题 public interface Sprite { ... } abstract class AbstractSprite implements Sprite { ... } public interface Builder<T> { public T build(); } class GameObjectImpl extends AbstractSpri

我目前正在将我所有的游戏代码移到另一个包中,以便在创建另一个类似的游戏时可以简单地重用它

不过我在这方面有一些问题

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> {
    ...
    }
}
公共接口精灵{
...
}
抽象类AbstractSprite实现了Sprite{
...
}
公共界面生成器{
公共T build();
}
类GameObjectImpl扩展了AbstractSprite{
公共静态类GameObjectBuilder实现生成器{
...
}
}
我正在使用生成器模式创建GameObjectImpl对象。但是,客户端(使用我的游戏引擎的人)只能访问Sprite界面


如何让客户端使用builder创建GameObjectImpl,并且只能访问Sprite界面?

您可以在同一个名为builder的包中再添加一个公开可见的类:

public final class Builders {

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

}
公共最终类生成器{

publicstaticbuilder为什么Builder需要是一个接口?为什么不让Builder像factory一样呢?似乎你想把接口与这个特定的实现联系起来

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
a
GameObjectImplFactory
…并为每个
Sprite
实现创建一个类似的类。您只需确保它们只返回
Sprite
类型

在您的示例中,您实际上会说类似于
公共类GameObjectImpleFactory implements Builder


希望这有帮助并且有意义:-)。

我不认为您希望将
Builder
类设置为通用类…相反
Builder.build()
应该返回一个Sprite对象。现在
build()
方法返回
T
在您的情况下,这是一个
GameObjectImpl

客户端将构建自己的精灵,因此我不会给他们任何预配置的精灵在我的示例中哪里有预配置的精灵?您说过客户端需要使用一个生成器,对吗?我的观点是,您为他们提供了一个仅返回一个Sprite(意味着它们必须遵守Sprite接口…并且您可以将实现包私有化)。这有意义吗?