2015-11-29 3 views
1

Я физик, работающий над научным кодом. Извиняюсь, если это обычный вопрос: на него, возможно, уже ответили раньше, но у меня нет достаточного знания программного обеспечения.Нужен ли мне синглтон?

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

Мне кажется, что шаблон Синглтона применим в этой ситуации: мы можем создать пул матриц, привязанный к тому, что отличает их друг от друга. Затем классы умножения могут получить доступ к этому пулу всякий раз, когда ему нужна матрица.

Вот эскиз того, что я имею в виду:

//SingletonDictionary.hpp 
class SingletonDictionary : private NonCopyable { 
    public: 
     void Clear(); //Calls member variable destructors. 
     ~SingletonDictionary() { Clear(); } 
    private: 
     friend SingletonDictionary& TheSingletonDictionary(); 
     SingletonDictionary() {}; //Only the friend can make an instance. 

     //Retrieve searches through the key vectors for a match to its 
     //input. In none is found, the input is added to the key vectors, 
     //and a new Value is constructed and added to the ValueVector. 
     //In either case the ValueVector is returned. 
     std::vector<double>& Retrieve(const int key1, const int key2); 

     std::vector<int> mKey1; 
     std::vector<int> mKey2; 
     std::vector<double> mValue; 
} 

//SingletonDictionary.cpp 
SingletonDictionary& TheSingletonDictionary() { 
    static SingletonDictionary TheSingleton; 
    return TheSingleton; 
} 

//DoMatrixMultiply.cpp 
void ApplyTransformation(std::vector<double> data){ 
    const int key1 = data.size()[0]; 
    const int key2 = data.size()[1]; 
    SingletonDictionary TheSingletonDictionary(); 
    std::vector<double> TransformMatrix = 
         TheSingletonDictionary.Retrieve(key1, key2); 
    DGEMM("N", "N", data.Data(), TransformMatrix.Data(),.....); 
} 

NonCopyable является абстрактным базовым классом, который отключает конструктор копирования и т.д.

мне интересно, если это уместно обстоятельство для этот узор. Если нет, что еще может сработать?

+1

Вы почти никогда не хотите Singleton. –

ответ

2

Синглтон - это глобальная переменная с сахарным покрытием, для большинства целей и целей. Глобальные переменные, конечно, полезны время от времени, но они также могут быть причиной проблем (потому что нет возможности иметь более одного состояния).

Я лично рассмотрел бы класс, который содержит эти значения (возможно, не скопируемые), но делает его (ссылочным) членом фактического расчета и более явным, что он используется. Это также позволит вам использовать более одного, если вам когда-либо понадобится ДВА (или более) этих объектов, вместо того, чтобы переписывать код для обработки этого случая.

+0

Проблема в том, что для нескольких экземпляров расчета может потребоваться одна и та же матрица. Или есть способ обойти это? – AGML

+0

Затем перейдите в тот же объект. Я хочу сказать, что одноэлемент может быть только один - нет ничего, что мешало бы вам использовать объект ONE всегда, даже если он хранится в качестве ссылки в десятках мест. У меня была аналогичная проблема, когда я создал свой объект «Parser» в моем компиляторе - я думал, что мне нужен только один, но мне тогда нужно было реализовать «Модули», для которых нужен «свежий» «Parser». Поэтому иногда бывает полезно создать второй, третий, четвертый экземпляр, и сохранение ссылки на экземпляр обычно стоит меньше, чем вызов функции, возвращающей статический экземпляр. –

Смежные вопросы