[Go言語]Builderパターン ~Builder~

こんにちは、KOUKIです。

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

デザインパターンまとめ

Builderパターンについて

Builder(建築者)」と名前がついている通り、Builderパターンはインスタンスの生成を得意とするパターンです。※Go言語にはオブジェクトが存在しないので、インスタンスとしています

私たちがプログラムを書く上で、インスタンスを生成して処理する状況は頻繁にあります。その中で、重複する処理を実装してしまったり誤ったパラメータでインスタンスを生成したり数十個に及ぶ引数が必要なインスタンスを生成しなければならなかったりなど、多くの問題に出くわすかと思います(人間だもの)。

Builderパターンで、シンプルなインスタンス生成にチャンレンジしましょう。

シチュエーション

最初に、Builderパターンを使わない場合の例を挙げます。

このコードは、HTMLのリストを生成します。

うまくいきました!

しかし、このコードにはいくつか問題点があります。

問題点 1: 全て手作業で設定しなければならない
2: タグ(ul/li)を間違えたり、閉じタグを忘れるかもしれない
3: 拡張性に乏しい

他にもあるかもしれません。

Builderパターンの適用

先ほどのサンプルにBuilderパターンを適用してみましょう。

HTML生成処理をロジック化する

最初に、HTML生成処理をロジック化します。

いきなり難しくなったと感じるかもしれません。しかし、これはBuilderパターンとは関係ないので、サラッと目を通すだけでOKです。

HtmlElement構造体が、今回生成したいインスタンスの金型です。このように構造体を定義すると、プログラムの処理によって何が生成されるかパッとわかるので、Builderパターン云々は関係なく、普通は定義します。

HtmlElement構造体をインスタンス化し、Stringメソッドを呼び出すことで、サンプルコードと同じ結果(あるいはよりグレートな結果)を得たいと思います。

Builderコンストラクタを導入

続いて、コンストラクタ関数を実装します。コンストラクタとは、インスタンス生成時に実行されるメソッドで、Builderパターンには必須です。

注目していただきたいのが、NewHtmlBuilder(rootTagName string)関数の引数です。インスタンスを生成するために必要なパラメータが、たったの一つなんですよね。

これにより、インスタンスの生成が簡単、かつ、利用しやすいコードになっています。※テストもしやすい

それじゃあ、どうやって他のパラメータを追加するんだよ、という感じになると思いますが、それはメソッドを別に用意します。

インスタンス生成後に、AddChildTagメソッドを呼び出すことで、要素をいくらでも追加できるようにしました。

Builderを呼び出す

このソースコードは、以下のようにして呼び出します。

シチュエーションのサンプルコードより、断然わかりやすく、作業ミスも起こりにくいコードになっていると思います。

取得できる結果もインデント付きのよりグレートな感じになっています^^

メソッドを繋げる

AddChildTagの戻り値をインスタンスにすると、メソッドを繋げることができます。

これもBuilderパターンのメリットですね。デザインパターンは面白いです。

次回

次回は、BuilderパターンのFacetsバージョンを学びます。

Go言語まとめ

ソースコード

コメントを残す