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

こんにちは、KOUKIです。

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

今回は、インスタンスのプロパティの面白い設定方法を紹介します。

デザインパターン

シチュエーション

例えば、こんな構造体があるとします。

Person構造体のプロパティとして、2つのグループを設定しました。一つは、Livesプロパティ、もう一つはWoksプロパティです。

通常なら、以下のようにインスタンス化すると思います。

Builderパターンを使うことで、このインスタンス生成を(実用的かどうかは置いておいて)面白い感じで行えます。

Builderパターン Facets適用

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

Builder構造体を定義

Builderパターンは、Building(構築)したい対象を構造体として定義することからは始めます。

今回は、Person、Lives(Group1)、Works(Group2)であるため、以下のように構造体を定義しました。

PersonBuilderが全体の親で、PersonLivesBuilderおよびPersonWorksBuilderがアグリゲート(集合)しています。これが、基本の型です。

コンストラクタの定義

Builderパターンの肝は、コンストラクタの定義です。コンストラクタは、インスタンス生成時に実装される関数で、以下のように実装します。

Builderパターンは、インスタンスの生成を単純にすることが用途の一つになります(そう思っている)。そのため、コンストラクタに渡す引数はなるべく少ない方がいいと個人的に考えています。

アグリゲートメソッドの定義

次に、アグリゲートメソッドを定義します。この言葉(アグリゲートメソッド)は、私の造語ですw

PersonLivesBuilder/PersonWorksBuilder構造体は、PersonBuilder構造体をアグリゲートしており、これらの構造体インスタンス化するメソッドを実装しました。

そうすることで、以下のようなことが行えます。

具体的には、「使ってみる」項目を参照してください。

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

PersonLivesBuilder/PersonWorksBuilder構造体のプロパティを設定するメソッドを実装しましょう。

これらのメソッドも全てインスタンスを返却しているので、メソッドを繋げて呼び出すことが可能です。

Builderメソッドの定義

最後に忘れてはいけないのが、Builderメソッドの定義です。

このメソッドは、最終的に生成した構造体を返却します。

使ってみる

main関数に以下のように設定しましょう。

OKですね。

こんな実装ができるなんて、面白いですよね。

どのタイミングで使うべきなのか見出せていませんが、知っていればいずれ役に立つことでしょう^^

次回

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

Go言語まとめ

ソースコード

コメントを残す