我需要一个单身人士吗?

时间:2015-11-29 22:08:28

标签: c++ singleton

我是一名研究科学代码的物理学家。如果这是一个常规问题,请道歉:它之前可能已经得到了解答,但我没有足够的软件工程背景知识。

基本上,代码需要执行大量的矩阵乘法 由少数不同的矩阵组成。首先构建矩阵是非常昂贵的,所以我希望它们在使用之间保持不变。但是,执行乘法的类无法知道矩阵在初始化期间将会是什么。它们在其生命周期内会有很大差异,并且乘法类的多个实例通常会使用相同的矩阵。

在我看来,Singleton模式适用于这种情况:我们可以创建一个矩阵池,通过任何区分它们的方式键入。然后,乘法类可以在需要矩阵时访问该池。

以下是我的想法草图:

//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 个答案:

答案 0 :(得分:2)

对于大多数意图和目的而言,单身人士是糖衣的全球变量。全局变量有时是有用的,但它们也可能是问题的原因(因为没有办法有多个insance)。

我个人会考虑拥有一个包含这些值的类(可能是不可复制的),但要使它成为实际计算的(引用)成员,并且更明确地表明它正在被使用。如果你需要有两个(或更多)这些对象,这也允许你使用多个,而不是必须重写代码来处理这种情况。