[Go言語]Flyweightパターンを学ぼう!

こんにちは、KOUKIです。

この記事では、デザインパターンの一つであるFlyweightパターンについて紹介します。

デザインパターンまとめ

シチュエーション

Flyweightパターンは、オブジェクトを使い回すことによりオブジェクトの生成コストを下げるパターンです。Goにはオブジェクトが存在しないので、構造体(インスタンス)が対象ですね。

オブジェクトの生成コストを下げる -> メモリの消費量を抑えられるので、良質なプログラムを書くことにつながります。

例えば、DBへのアクセスを例に考えてみましょう。

実際には、DBにアクセスしないので、中身は適当です。

DBにアクセスするためには、DBのインスタンス化が必要です。

DB構造体には、DBへの接続情報が入っており、たくさんインスタンスを生成するとそれだけメモリを食います。

このように各インスタンスが接続情報を保持するのではなく、共有化すれば、メモリの消費を抑えられます。

Flyweightパターンの実装

Flyweightパターンのコアは「インスタンスの生成コストを下げる」ことにあり、それによりメモリの消費を下げます。

そのための方法として、インスタンスの共有(再利用)ができるように、先ほどのソースコードを書き換えてみましょう。

poolを用意

インスタンスを共有するためのpool(格納庫)を用意しました。keyにDB名、valueにコネクション情報を格納します。

インスタンス取得

poolにコネクション情報が存在しない場合は、NewDB(コンストラクタ)を呼び出してインスタンスを生成し、存在する場合は、poolからインスタンスを取得する処理を実装します。

これで、インスタンスを共有することができるようになりました。

新しくインスタンスを生成しないので、メモリの消費を抑えることができます。

まとめ

もしかしたら、Flyweightパターンを実装する機会はあまりないかもしれません。しかし、メモリの消費を意識するプログラミングを行えることは、プログラミング上級者を目指す上で必要なことだと思うので知っていて損はないと思います。

それでは、また!

サンプル

本記事のサンプル

他にも色々な実装例があるので、参考までに載せておきます。

同一名称を使い回す例

テキスト文字列を使い回す例

Go言語まとめ

ソースコード

コメントを残す