[Golang]Builderパターンを学ぼう!~Version 2~

こんにちは。KOUKIです。

以前、Bilderパターンについて記事を書きましたが、別パターンでも実装したので紹介します。

Builderパターン

Builderパターンは、オブジェクトを生成する過程を抽象化することで、動的なオブジェクトの生成を可能にするパターンです。

プログラムの規模が大きくなると扱うオブジェクトもまた巨大化する傾向があります。また、似た機能をもった別のプロセスで作られたオブジェクトが大量に発生するかもしれません。

例えば、乗り物を例に考えてみましょう。

車、バイクの2種類のオブジェクトを作りたいとします。それぞれのパラメータは、以下です。

<車>
名前 — Car
席 — 5
車輪 — 4

<バイク>
名前 — MotorBike
席 — 1
車輪 — 2

こうしてみると必要なパーツは少し異なります。しかし、オブジェクトを生成するプロセスは抽象化できます。

<生成プロセス>
1. 車輪をセットする
2. 席をセットする
3. 組み立てをする
4. オブジェクトを取得する

この様に生成プロセス(Builder)を抽象化させることで、一定のルールを設けることができます。

この事を踏まえて、プログラミングしてみましょう。ちなみに、Go言語にはオブジェクトという概念はないのですが、ここでは便宜上、インスタンスをオブジェクトと呼ぶことにします。

生成プロセスをインターフェースで定義する

一番重要な生成プロセスをインターフェースで定義しましょう。

Directorを定義

オブジェクトを組み立てるために、Director(監督者)を用意します。

具体的な使い方はテストコードを見ていただけるとわかると思います。

プロダクト情報

乗り物の情報をStructで定義しましょう。

Carの生成

準備は整ったので、Carを作成するメソッドを定義しましょう。

Carには、BuildProcessインターフェースで定義した関数をメソッドとして全て定義しています。これによりインターフェースを実装したことになるので、DirectorのSetBuilderメソッドに引数として渡すことができる様になります。

Motorbikeの生成

Carと同じようにMotorbikeを作成するメソッドを実装しましょう。もしかしたら、もうピンとくるかもしれませんね^^

Carと同じメソッドを定義しました。これにより、MotorBikeもDirectorに渡せます。

これにより、オブジェクトの生成プロセスをCarと同じにできました。

乗り物を実装したい時は、定義した生成プロセスに沿って実装する」ということをルール化できたわけですね。

テストコードの実装

テストコードで、Builderパターンの使い方を確認しましょう。

上記のコードでは、DirectorにCar及びMortarbikeのオブジェクトを渡し、組み立てを行っています。

そして、GetVechicleメソッドにて、生成済みのインスタンスを取得しています。

このように、Builderパターンはオブジェクトの生成に一定のルールを設けられる結構便利なパターンなのです。

最後にテストコードを実行しましょう。

OKですね。

おわりに

Builderパターンは、コマンドラインツールを作成するときに使う機会があるかもしれませんね。コマンドラインツールは特定のルールに従って何らかの成果物を生成したいときに使いますので

例えば、OS(Linux, Mac, Windows)別のログ出力ツールとかならイメージが沸きやすいかもですね。

やりたいこと(ログの切り抜きなど)は同じですが、オブジェクト(ファイルシステムなど)は異なると思うので、その辺を抽象化するといい感じのツールができそうです。

いつか機会があればやってみようと思います^^

それでは、また!

Go記事まとめ

デザインパターンまとめ

Go記事をまとめます。

ソースコード

builder.go

builder_test.go

コメントを残す