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

こんにちは、KOUKIです。

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

前回は、BuilderパターンのParameterを実装することで、インスタンス生成なしで機能を利用できる方法を紹介しましたが、今回は、それの関数バージョンを紹介したいと思います。

Functional Builderの実装

早速、実装していきましょう。

Email構造体

最初に、Build(構築)対象の構造体を定義します。

利用者側では、この構造体をインスタンス化をせず、関数の呼び出しのみで利用できるようにします。

Builder構造体と関数

次に、Builder構造体と関数 Typeを定義します。

ここが、今回の肝です。emailSet Typeは、emailを引数にした関数をTypeで持ち、EmailBuilderのパラメータとして宣言します。

プロパティ設定メソッドの実装

次は、プロパティ設定用のメソッドを定義します。

actionsには、emailSet Typeのスライスが必要なので、それぞれのメソッド内で無名関数を定義し、appendで追加しています。

また、戻り値をEmailBuilderのレシーバーにすることで、メソッドを数珠繋ぎで呼び出すことができます。※詳細は、「使ってみる」項目を参照してください

Buildメソッドの定義

最後に、Buildメソッドを定義します。

b.actionsには、メソッドを呼び出した結果(無名関数)が格納されているので、それをループで回し、プロパティを設定する流れです。

使ってみる

実際に使ってみましょう。

各メソッドの戻り値は、EmailBuilderのレシーバーにしてあるので、上記のように数珠繋ぎで呼び出すことができます。そして、最後の仕上げとしてBuildメソッドを呼び出すことで、Build(構築)するという流れです。

まとめ

本記事で、Builderパターンは完了です。ガンガン使っていきましょう^^

Builderパターン 1: インスタンスを生成する際のコンポーネントを分けて実装できる
2: レシーバーを返すことで、数珠繋ぎにメソッドを呼び出せる
3: 共通の構造体を定義することで、別々のBuilderで得た結果を統合できる
4: インスタンス化がシンプルになる

Go言語まとめ

ソースコード

コメントを残す