[Go言語, Python] Singletonパターンを学ぼう!

派遣プログラマーになってから約4年経ちました。数々の試練を乗り越えて来ましたが、まだまだプログラミングの腕は未熟です^^;

プログラマーとして達人の域に達するにはどうしたら良いかと考えて、デザインパターンを学ぼうと決めました。

本日は、業務でも使っているSingletonパターンを学びます。

Singletonとは

Singletonパターンは、プログラムの実行プロセスの中で、インスタンスを一つのみ生成することを保障したパターンです。

プログラムを書いていると「このインスタンスは一回しか作られないことを保障したいな」と思う時がたまにあります。

直近の業務だと、Redisへアクセスするインスタンスを作った時にSingletonを使いました。

Redisへアクセスできるインスタンスを不用意に作成したくなかったからです。

Go言語とPythonを使って、Singletonを実装してみましょう。

Go言語編

Go言語では、sync.Onceパッケージを利用することで、Singletonを実装できます。

GetSingletonDatabaseにDB名(PostgreSQL, MySQL)を渡して、インスタンスを生成しました。

実行してみましょう。

PostgreSQLのみ作成されました。

このように、「生成できるインスタンスは一つ」であることを保障しています。

Python編

Go言語と違ってPythonにはClassがあるため、Type classを継承したSingletonクラスを作成します。

type classを継承するとtype classの__call__メソッドが使えるようになります。

__call__メソッドは、インスタンスを関数のように呼び出した時に実行される特殊メソッドです。

SingletonにしたいクラスのメタクラスとしてSingletonクラスを渡すことで、継承先のクラス(ここではDatabase)がインスタンス化された時に、Singletonクラスに設定された__call__メソッドが実行されるようです。

そして、__call__メソッド内でインスタンス化のチェックを行い、未作成の場合はインスタンスを生成して返します。※作成済みの場合は、instance変数に保持されたインスタンスを返す

実行してみましょう。

DB Nameは、どちらもPostgreSQLですね。注目すべき点は、second callが一度しか呼ばれていないことです。

__init__は、インスタンス化された時に呼び出される特殊メソッドなので、Singletonが実装できていることがわかります。

おわりに

今回は、デザインパターンの一つであるSingletonパターンを学びました。

Singletonを活用すれば不用意なインスタンスを作成しなくて済む為、より自信を持ってプログラミングできるようになりますね^^

それでは、また!

コメントを残す