2010-03-04 58 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