Я физик, работающий над научным кодом. Извиняюсь, если это обычный вопрос: на него, возможно, уже ответили раньше, но у меня нет достаточного знания программного обеспечения.Нужен ли мне синглтон?
В основном, код должен выполнять большое количество матричных умножений на небольшое количество различных матриц. Построение матриц в первую очередь очень дорого, поэтому я бы хотел, чтобы они сохранялись между приложениями. Тем не менее, класс, который делает умножение, не имеет возможности узнать, какие матрицы будут во время его инициализации. Они будут существенно отличаться в течение всего срока службы, и одна и та же матрица обычно будет использоваться несколькими экземплярами класса умножения.
Мне кажется, что шаблон Синглтона применим в этой ситуации: мы можем создать пул матриц, привязанный к тому, что отличает их друг от друга. Затем классы умножения могут получить доступ к этому пулу всякий раз, когда ему нужна матрица.
Вот эскиз того, что я имею в виду:
//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 является абстрактным базовым классом, который отключает конструктор копирования и т.д.
мне интересно, если это уместно обстоятельство для этот узор. Если нет, что еще может сработать?
Вы почти никогда не хотите Singleton. –