我目前正在将我的所有游戏代码移动到另一个包中,这样我就可以在创建另一个类似的游戏时重复使用它。
我遇到了一些问题。
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 Pattern来创建我的GameObjectImpl对象。但是,客户端(使用我的游戏引擎的人)只能访问Sprite界面。
如何让客户端使用构建器创建GameObjectImpl并且只能访问Sprite接口?
答案 0 :(得分:2)
您可以在名为Builders的同一个包中添加一个公开可见的类:
public final class Builders {
public static Builder<? extends Sprite> newGameObjectBuilder() {
return new GameObjectImpl.GameObjectBuilder();
}
}
答案 1 :(得分:0)
为什么Builder需要成为一个界面?为什么不做一个类似建筑商的工厂呢?您似乎希望将接口与此特定实现联系起来。
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>
。
希望这有用并且有意义: - )。
答案 2 :(得分:0)
我认为你不想让Builder
类通用...而Builder.build()
应该返回一个Sprite对象。现在build()
方法正在返回T
,在您的情况下是GameObjectImpl