单引用多个对象

关于如何在OO / DB关系中做什么,我有点... 这是DB模型:
CREATE TABLE User
    Id

CREATE TABLE Location
    userId
    // EDIT oups, wrong !
    // placeId
    // Should be :
    seatId

CREATE TABLE Game
    locationId
现在一些代码:
class User
{
    private Location locations[]; // need this for several reasons...

    public function loadFromDatabase()
    {
        // Load data from DB
        // ...
        result = DB::query("SELECT Id FROM Locations WHERE userId="+this->Id);
        foreach(result)
        {
            l = new Location();
            l->loadFromDatabase(result);
            locations[] = l;
        }
    }    
}

class Location
{
    private User user;
    public function loadFromDatabase()
    {
        ...
    }
}

class Game
{
    private Location location;
    public loadFromDatabase()
    {
        /*
        Here comes the problem : 
        how to have a reference to a location 
        created by the User class ?
        */
    }
}
用户在多个位置玩游戏。 编辑:对于用户在座位上玩的每个位置。或者在另一个座位...... 当我想知道游戏的位置时,我访问Game.location。当我想知道是谁播放它时,我访问Game.location.user 这是我的问题:我希望Game.location与User.locations之一相同,我不知道如何做到这一点...... 而且,在全球范围内,我觉得我的代码有问题...... 有帮助吗? 谢谢     
已邀请:
由于你的
Location
表中有一个
placeId
,我假设有一个
Place
表描述了实际的位置,而
Location
表只是表示用户和地点之间的多对多映射。 在这种情况下,
Location
不需要有自己的
Id
,也不需要是一个类,但
Place
确实如此。 要从数据库中仅加载每个对象的一个​​实例,请将实例缓存在每个类内的静态映射中。
class Place
{
    // Static
    private static Place loadedPlaces[];

    public static function get(id)
    {
        if (!loadedPlaces[id])
        {
            loadedPlaces[id] = new Place(id);
            loadedPlaces[id]->loadFromDatabase();
        }
        return loadedPlaces[id];
    }

    // Non-static
    private id;

    public function loadFromDatabase()
    {
        // ...
    }
}
然后,要获取对用户或游戏属性的位置的引用,只需通过静态方法访问它们。
class User
{
    public function loadFromDatabase()
    {
        result = DB::query("SELECT placeId FROM Locations WHERE userId="+this->Id);
        foreach(result)
        {
            places[] = Place::get(result);
        }
    }    
}

class Game
{
    public function loadFromDatabase()
    {
        place = Place::get(place);
    }
}
这用于: 延迟初始化,因为仅在需要时才加载场所。 Multiton模式,因为id只有每个地方只有一个实例。 不完全是工厂方法,因为没有涉及对象层次结构。     

要回复问题请先登录注册