0

在我的基础框架中,我喜欢有可以在多个项目中重用的类。大多数情况下,这些都是通用的,以提供灵活性。

我有一个很小的标题,用于存储数据并轻松获取数据。

#pragma once
#include <map>
#include <string>

namespace BaseFrameWork
{
template<class TValue, class TKey = std::string>
class Provider
{
public:
  static TValue& Get(TKey const& key);
private:
  static std::map<TKey, TValue> _dataMap;
};
}  

是的,它只是地图的包装,但我喜欢它作为从中获取数据的中心位置。
例如,我可以Provider<Room>::Get("U-18")从谁在乎从哪里获取加载的对象。

我承认拥有这样的全局对象是多么不受欢迎,但这不是公共 API 的一部分,仅用于团队可以使用它的个人项目。

我想知道的是这种模式是否有一个名称,如果它甚至是一个。我总是称它为 Provider-Pattern,因为它就是这样做的,提供东西,但我看到那已经被采用了。

请不要告诉我这段代码有多糟糕以及我应该如何为它感到难过。

4

2 回答 2

1

这是一个单例模式,数据项是一个map(当访问是通过一个 getter 并且可能是 setter 时,实际上是一个不透明的关联容器)。关联容器本身通常不被视为设计模式。

如果您正在寻找简洁明了地传达此设计的短语,则类似于“初始化(何时/如何)的单例映射并且此后只读”。

于 2012-10-22T09:54:03.460 回答
1

好的,我在你的课上遇到的问题:

  1. 真的Get()应该TValue通过非常量引用返回。这本质Get()上是一个 setter 和一个 getter。如果它通过std::map's实现,operator[]那么它将插入并创建一个默认构造的 TValue,您可以愉快地分配给它或修改它。
  2. 静态私有成员变量通常是错误的。无论何时拥有一个,最好将该成员完全隐藏在编译单元的匿名命名空间中。
  3. 因为它是一个模板,你究竟在哪里实例化实例?每个实例都需要单独实例化。
于 2012-10-22T10:06:22.640 回答