Класс регистрации Singleton - PullRequest
       26

Класс регистрации Singleton

0 голосов
/ 28 августа 2018

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

Registry.instance().addElement('name1', NewObject(...));
Registry.instance().get('name1').Value
Registry.instance().get('name2').Value = 1;

Считывание свойств возвращаемого класса можно обойти, удалив () из instance:

 >> Equipment.instance.get('name1').Value

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

Как правильно внедрить и использовать такой «единый реестр» в MATLAB?

Следует отметить, что синглтон-класс содержит некоторую логику, которая вызывается при добавлении элементов в список, логику для правильного уничтожения объектов в правильном порядке и другие методы, которые выполняют итерацию по списку объектов. По этой причине «обычный» containers.Map не может быть использован.

1 Ответ

0 голосов
/ 28 августа 2018

Это может быть то, что вы ищете:

classdef (Abstract) Registry % < handle   <-- optional

  methods (Access = public, Static = true)

    function addElement(elementName, element)
      Registry.accessRegistry('set', elementName, element );
    end    

    function element = get(elementName)
      element = Registry.accessRegistry('get', elementName);
    end

    function reset()
      Registry.accessRegistry('reset');
    end
  end

  methods (Access = private, Static = true)

    function varargout = accessRegistry(action, fieldName, fieldValue)
    % throws MATLAB:Containers:Map:NoKey
      persistent elem;
      %% Initialize registry:
      if ~isa(elem, 'containers.Map') % meaning elem == []
        elem = containers.Map;
      end
      %% Process action:
      switch action
        case 'set'
          elem(fieldName) = fieldValue;
        case 'get'
          varargout{1} = elem(fieldName);
        case 'reset'
          elem = containers.Map;
      end        
    end
  end

end

Поскольку MATLAB не поддерживает static свойства , необходимо прибегнуть к различным обходным решениям , возможно, включающим methods с persistent переменными, как в моем случае ответить.

Вот пример использования выше:

Registry.addElement('name1', gobjects(1));
Registry.addElement('name2', cell(1) );     % assign heterogeneous types

Registry.get('name1')
ans = 
  GraphicsPlaceholder with no properties.

Registry.get('name1').get    % dot-access the output w/o intermediate assignment
  struct with no fields.

Registry.get('name2'){1}     % {}-access the output w/o intermediate assignment
ans =
     []

Registry.get('name3')        % request an invalid value
Error using containers.Map/subsref
The specified key is not present in this container.
Error in Registry/accessRegistry (line 31)
          varargout{1} = elem(fieldName);
Error in Registry.get (line 10)
      element = Registry.accessRegistry('get', elementName); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...