Design pattern appropriate for a singleton with static members as the only interface?
<p>From a user's perspective, I want to write something like:</p>

<pre><code>Config::Set("Port", nPort);
...
connect(Config::Get("URL"), Config::Get("Port"));
</code></pre>

<p>I feel it's a bit cleaner than the <code>Config::Instance().Get("URL")</code> singleton or even <code>Config().Get("URL")</code> monoid alternatives. But there are a couple ways to get this result: </p>

<ol>
<li>Have <code>Config</code> be a static singleton class with protected Instance() method, and <code>Get</code> would internally do something like <code>return Instance().mSettings[_key];</code></li>
<li>Make <code>Config</code> a namespace, store 'member data' in Config.cpp (so as not to expose the implementation to the user). This allows for <code>using namespace Config;</code>, but makes it less trivial to convert to a non-singleton</li>
<li>Define the actual configuration 'singleton' inside Config.cpp, which can be returned from a static <code>ConfigImpl &amp; GetInstance()</code> function</li>
<li>Something I haven't thought of</li>
</ol>

<p>I'm sure I'm not the only one that has thought about this - are there any other options that offer additional benefits, or detriments to the methods I mentioned above? Currently I'm using option #1, and it works fine, but it does get a bit arduous writing <code>Instance().mSettings</code> constantly.</p>
