或阿呆のブログ

Pythonを好んで使っているプログラマです。Ruby,Perl,PowerShell,VBAなどでもたまに書いています。最近はスロット放浪記やってます。。

コンストラクタをprivateで定義して、クラスインスタンスをnew出来ないようにする。

singletonのデザインパターンの実装をするときによくやる技。明示的にprivateで引数無しコンストラクタを定義することにより、インスタンスが複数されないようにデザイン出来る。

namespace Test
{
    class StringUtil
    {
        private StringUtil thisInstance = null;
        private string m_name = null;

        private StringUtil()
        {
        }

        public StringUtil(string name)
        {
            m_name = name;
        }

        public StringUtil getInstance()
        {
            if (thisInstance == null)
            {
                thisInstance = new StringUtil();        
            }
            return thisInstance;
        }        

    }
}

こんな感じで実装する。

このクラスをnewすると、コンパイルレベルで怒られる。

エラー	1	'Test.StringUtil.StringUtil()' はアクセスできない保護レベルになっています。	C:\Users\One-shot life\Documents\Visual Studio 2010\Projects\TEST\Test\Test\Program.cs	12	37	Test

このクラスのインスタンスの生成を行うには、getInstance()というメソッドを使うしかない。このメソッド内で、インスタンスがnullの場合にのみnewしているので、インスタンスが複数作られないような作りとなる。

ただし、引数付きコンストラクタを定義して、そっちからインスタンスを生成出来るので、そういうことがされないように、プログラマが注意しなければならない。まぁ、気をつけてれば大丈夫だとは思う。