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

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

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

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


person Malfist    schedule 20.07.2010    source источник


Ответы (2)


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

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).
}

person bhups    schedule 20.07.2010

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

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;
        }
    }
}
person JeremyFromEarth    schedule 20.07.2010
comment
Я действительно сделал это и принял ответ. У меня есть статическая функция, которая создает объект, но выполняет бинарный поиск в статическом массиве, отсортированном по идентификатору. - person Malfist; 20.07.2010