なんじゃくにっき

プログラミングの話題中心。

Scala de Design Pattern: Builder

 Builderパターン。

package designpattern.builder

import scala.Enumeration

sealed trait Animal { val value: String }
object Lion extends Animal {val value = "Lion"}
object Eagle extends Animal {val value = "Eagle"}
object Human extends Animal {val value = "Human"}

class CompositAnimal(var element1: Animal, var element2: Animal) {
override def toString = element1.value + " + " + element2.value
}

trait Composer {
val result = new CompositAnimal(null, null)
def setElement1: Unit
def setElement2: Unit
}

class GrifonComposer extends Composer {
def setElement1 = result.element1 = Lion
def setElement2 = result.element2 = Eagle
}

class SphinxComposer extends Composer {
def setElement1 = result.element1 = Lion
def setElement2 = result.element2 = Human
}

class EaglemanComposer extends Composer {
def setElement1 = result.element1 = Eagle
def setElement2 = result.element2 = Human
}

class Director(var composer: Composer) {
def getCompositAnimal = composer.result
def compose = {
composer.setElement1
composer.setElement2
}
}

object Main {
def main(args: Array[String]) = {
val director1 = new Director(new GrifonComposer)
director1.compose
val grifon = director1.getCompositAnimal
println(grifon)

val director2 = new Director(new SphinxComposer)
director2.compose
val sphinx = director2.getCompositAnimal
println(sphinx)
}
}