tag:crieit.net,2005:https://crieit.net/tags/DesignPatterns/feed 「DesignPatterns」の記事 - Crieit Crieitでタグ「DesignPatterns」に投稿された最近の記事 2019-04-21T23:35:17+09:00 https://crieit.net/tags/DesignPatterns/feed tag:crieit.net,2005:PublicArticle/14942 2019-04-21T23:35:17+09:00 2019-04-21T23:35:17+09:00 https://crieit.net/posts/tmrts-go-patterns-Builder-Pattern tmrts/go-patternsのBuilder Patternを日本語に勝手訳した <p>この記事は <a target="_blank" rel="nofollow noopener" href="https://github.com/tmrts/go-patterns/blob/master/creational/builder.md">https://github.com/tmrts/go-patterns/blob/master/creational/builder.md</a> を勝手に翻訳したものです。なので、内容の正確さは<strong>全く保証されてません</strong>。なので、気になる人はちゃんとオリジナルのコンテンツを読みましょう。(とはいえ、誤訳は指摘してもらえると嬉しい…</p> <h1 id="Builder Pattern"><a href="#Builder+Pattern">Builder Pattern</a></h1> <p>Builder patternとは、複雑なオブジェクトの表現から生成(コンストラクト)を分離させたものであるので、同じコンストラクトの処理で異なる表現を作成することができる。</p> <p>Goにおいては、通常、設定用のstructが同じふるまいを達成するために使われる。ただし、builder methodにstructを渡すということは<code>if cfg.Field != nil {...}</code>というチェックのボイラプレートのコードで満たすことができる。</p> <h2 id="実装"><a href="#%E5%AE%9F%E8%A3%85">実装</a></h2> <pre><code class="go">package car type Speed float64 const ( MPH Speed = 1 KPH = 1.60934 ) type Color string const ( BlueColor Color = "blue" GreenColor = "green" RedColor = "red" ) type Wheels string const ( SportsWheels Wheels = "sports" SteelWheels = "steel" ) type Builder interface { Color(Color) Builder Wheels(Wheels) Builder TopSpeed(Speed) Builder Build() Interface } type Interface interface { Drive() error Stop() error } </code></pre> <h2 id="使い方"><a href="#%E4%BD%BF%E3%81%84%E6%96%B9">使い方</a></h2> <pre><code class="go">assembly := car.NewBuilder().Paint(car.RedColor) familyCar := assembly.Wheels(car.SportsWheels).TopSpeed(50 * car.MPH).Build() familyCar.Drive() sportsCar := assembly.Wheels(car.SteelWheels).TopSpeed(150 * car.MPH).Build() sportsCar.Drive() </code></pre> <h2 id="所感"><a href="#%E6%89%80%E6%84%9F">所感</a></h2> <p>(これは訳者、つまりこの記事を書いている人の勝手な意見)<br /> 同じコンストラクタを使って、パラメータに応じて異なる動作をする何かを生成するときに使えそう。例えば、異なるDBドライバを利用する何かだったり、コンテナのランタイムに応じて内部的な動作を切り替えるドライバ的な何かとか?サンプルコードの車の例はわかりやすくて理解に役立った。</p> shige