Builder
デザインパターンとは
デザインパターンとはオブジェクト思考開発における先人たちが作り上げてきた便利な設計図です。
Gang of Four通称Gofが1994年に出版した『オブジェクト指向における再利用のためのデザインパターン』の中で23個の設計図が紹介されています。
Note
デザインパターンのサンプルコードはSwift4でまとめます。
ビルダーパターンとは?
ビルダーパターンはインスタンスの生成を抽象化するパターンです。
登場する概念クラスは3つで、ProductとBuilderとDirectorです。
Productは生成したいクラスです。DirectorはBuilderを使ってProductを生成します。ProductとDirectorは1つづつですが、Builderは複数存在します。
サンプルコード
サンプルでは3びきのこぶたを例にBuilderパターンを解説していきます。
Product
Productはぶたの兄弟が作る家です。なんの素材で作られているのかと耐久度をメンバに持っています。
class PigHouse {
var material: String
var durability: Int
init(material: String, durability: Int) {
self.material = material
self.durability = durability
}
}
Director
Directorはオオカミです。オオカミは家を吹き飛ばすメソッドとターゲットにするブタの家をメンバに持っておきます。
class Wolf {
var target: Builder
init(pigHouse: Builder) {
target = pigHouse
}
func blowOff(){
target.houseDurability(damage: 50)
}
}
Builder
Builderはブタです。本来は3びきですが、2匹いれば解説できるので藁の家を作ったブタとレンガの家を作ったブタのBuilderクラスを作成しました。
class pigBuilder1: Builder {
let house = PigHouse(material: "藁", durability: 20)
func houseDurability(damage: Int){
house.durability -= damage
}
func result() -> String{
if house.durability > 0 {
return "家は無事です!!!"
}
return "家が壊れてしまいました"
}
}
class pigBuilder2: Builder {
let house = PigHouse(material: "レンガ", durability: 100)
func houseDurability(damage: Int){
house.durability -= damage
}
func result() -> String{
if house.durability > 0 {
return "家は無事です!!!"
}
return "家が壊れてしまいました"
}
}
呼び出し部分
//藁の家を狼が吹き飛ばす
let wolf1 = Wolf(pigHouse: pigBuilder1())
wolf1.blowOff()
print("藁の家は\(wolf1.target.result())")
//レンガの家を狼が吹き飛ばす
let wolf2 = Wolf(pigHouse: pigBuilder2())
wolf2.blowOff()
print("レンガの家は\(wolf2.target.result())")
コンソールにはこのように出力されます。
藁の家は家が壊れてしまいました
レンガの家は家は無事です!!!