[Go言語]Factoryパターン~後編~

こんにちは、KOUKIです。

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

デザインパターン

Factory Generator

前回の実装では、「利用者側で必要なデータを揃える -> コンストラクタを呼ぶ(インスタンス化) -> インスタンスを利用」のような使い方でした。

しかし、このインスタンス化したデータを作成するのに、コンストラクタを毎回呼び出す必要があります。

大抵の場合はそれでOKなのですが、次のシチュエーションの場合はどうでしょうか。

HTMLのフォームをイメージしてください。formsをWebブラウザに返却するとその構成要素がフォームとなって描画されるイメージです。

このプログラムでは、フォーム要素を作成するために、何度もNewHtmlTagコンストラクタを呼び出しています。しかし、コンストラクタの呼び出しは一回で済ませたいところです。

というわけで、以下のように実装してみましょう。

NewHtmlTagFactoryの戻り値を関数にしました。そうすることで、コンストラクタの呼び出しは一度のみで、先ほどと同じことが行えます。

今回は、input タグを作りましたが、textareaタグなど他のタグを作りたい場合は、次のようにします。

使いやすいですよね。

NewHtmlTagFactoryコンストラクタの戻り値を関数にしていますが、これだとわかりずらい!という方もいると思うので、以下のように実装してもOKです。

NewHtmlTagFactory2では、HtmlTagFactory構造体を返すように実装しました。少しは、実装がシンプルになった気がしますよね。

Prototype Factory

生成できるTagの種類を定数(プロトタイプ)として設定するやり方もあります。

Go言語のiota識別子で、連番の数値(0 ~ 2)を生成しています。これをコンストラクタ内のSwitch文のcaseに指定することで、コンストラクタに与えられたパラメータによって、生成するインスタンスを選択できるようにしました。

このコードは、次のように使います。

InputTagを定数で宣言しているので、NewHtmlTagの引数として渡せます。しかも数値ではなく、”InputTag“という文字列で渡せるので処理がわかりやすいと思います。

このパターンも便利そうです。例えば、AWS/GCP/Azuraへ接続を行いたいとなった時に、以下のようにわかりやすく実装できます。

まとめ

Factoryパターンは、インスタンスの生成をわかりやすく実装する上で重宝しそうなパターンですね。

今までは適当(?)にコンストラクタを作成していましたが、このパターンを取り入れて、もっと実用的なプログラミングを行えるようになりたいと思います。

Go言語まとめ

ソースコード

Factory Generator

Prototype Factory

コメントを残す