用C ++替换内存管理器的单例解决方案

时间:2016-03-31 20:22:33

标签: c++ design-patterns singleton

我的项目中有两个用于管理内存的类:MemoryStorageMemoryFile

第一个与HDD类似,通过使用单例(添加,删除,释放等)保留MemoryFiles(文件,目录等)。第二个像fstream一样工作,但是对于内存(打开,关闭,写入,读取等)。

使用示例

MemoryFile file(&MemoryStorage);
// Open file in write mode
if (file.open("filename", open_mode::out)) {
    // Data file
    int* obj = new int;
    *obj = 0;
    // Write in internal buff
    file.write(obj, sizeof(int));
    delete obj;
    // Put buff in MemoryStorage and clear buff
    file.close();
}
// Other moment
// Open file in read mode
if (file.open("filename", open_mode::in)) {
    // Data file
    int* obj = new int;
    // Write in internal buff
    file.read(obj, sizeof(int));
    cout << *obj << endl; // Print: 0
    delete obj;
    // Put buff in MemoryStorage and clear buff
    file.close();
}

如果我不使用单例,则可以在内存中创建具有相同名称的文件,从而导致文件系统不一致。

我已经阅读了像this one这样的堆栈溢出中的几篇文章,这些文章讨论了单身人士如何根据许多程序员的不良模式。

如果没有单例模式,我还能如何解决上面的编程问题? 我是否在MemoryStorage中使用私有静态成员来复制单例的效果?

2 个答案:

答案 0 :(得分:0)

无论您的用例如何,如果您完全确定,您所代表的对象在现实世界中只有一个实例,例如memomy manager,使用singleton肯定是一个合理的选择。

单身人士的问题是,它不像看起来那样简单。举几个问题,您将面临一些问题 - 多线程环境怎么样,您能绝对保证不会创建两个单身人士吗?那些单身人士的破坏呢?继承或拥有更多单身人士怎么样?

我建议,如果您觉得单身是一种方法,请尝试一下,但要注意在开始实施之前可能需要解决的所有问题。

答案 1 :(得分:-1)

YATAS!关于单身人士的另一个主题。 单身人士只有在代表某些事物时才会被使用,这些事物本身只是为了你正在执行的过程而以单数形式存在。像FILESYSTEM,LOG等

同时如果你有真实的案例,不要避免单身人士。不要向纯粹主义者倾听,除了&#34;代码样本&#34;之外,他们几乎不会写任何真正的代码。