Не совсем синглтон - PullRequest
       1

Не совсем синглтон

0 голосов
/ 20 июля 2010

Я использую ActionScript3 для разработки уровня доступа к данным для приложения, над которым работает другой разработчик в моей команде. Один из объектов, назовем его User, дорого построить. У каждого пользователя есть уникальный идентификационный номер, поэтому я могу сказать, были ли они созданы ранее или нет, и все User объекты хранятся в массиве где-то еще.

Я хочу иметь возможность ограничить его, чтобы можно было только один раз создать User для каждого идентификатора. И.Е. каждый пользователь должен быть уникальным, а запросы на уже созданный User должны получить предварительно созданный User.

Если бы я использовал здравый, хорошо спроектированный язык, я бы просто сделал его закрытым конструктором и заставил бы все запросы объекта проходить через функцию, которая кэшировала вещи. Но flash не позволяет использовать частные конструкторы (только публичные и внутренние, ни один из которых не будет работать). Как мне этого добиться?

Ответы [ 2 ]

2 голосов
/ 20 июля 2010

Если вы хотите стать частным строителем, вы можете добиться этого следующим образом:

package somepackage {
  public class User {
    public function User(SingletonEnforcer s):void {
      if (s == null)
        throw new Exception("Sorry mate!!!");
    }
    public static GetUserWithId(id:String):User {
      //user with this id exists then return it.
      //create a new user, initialize it, cache it and return
    }
  }
}
class SingletonEnforcer {
  //this is only visible to this class (User).
}
1 голос
/ 20 июля 2010

Вы можете использовать словарь для хранения идентификаторов пользователей, сопоставленных с экземплярами пользователей. Таким образом, вы можете проверить, существует ли уже существующий пользователь, прежде чем создавать нового. Вот некоторый псевдокод:

public class UserLookup()
{
    var _lookup:Dictionary = new Dictionary();

    function getUser( id:int ):User 
    {
        if( _lookup[id] ) {
            return _lookup[id]
        } else {
            var user = new User( id );
            _lookup[ id ] = user;
            return user;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...