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