这段代码是否代表设计模式?

时间:2012-10-22 09:48:45

标签: c++ design-patterns

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

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

#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,因为它的功能是什么,提供了东西,但我看到已经采用了它。

请不要告诉我这段代码有多糟糕以及我应该为它做些什么。

2 个答案:

答案 0 :(得分:1)

它是一个单例模式,数据项为map(当通过getter和大概设置器进行访问时,实际上是一个不透明的关联容器)。关联容器通常不被认为是设计模式本身。

如果你正在寻找一个能够简洁明了地传达这个设计的短语,那就像“Singleton地图初始化(何时/如何)和之后的只读”。

答案 1 :(得分:1)

好的,我和你班上的问题:

  1. Get()是否真的应该通过非const引用返回TValue。这基本上使Get()成为一个setter和getter。如果它通过std::map的{​​{1}}实现,那么它将插入并创建默认构造的TValue,您可以愉快地分配或修改它。
  2. 静态私有成员变量通常是错误的。只要你有一个,你最好将成员完全隐藏在编译单元的匿名命名空间中。
  3. 因为它是一个模板,你在哪里实例化实例?每个实例都需要单独实例化。