scalaでFactoryMethodPattern


最近、デザインパターンを学習しています。
学習に使っているブログはこちらです。
http://d.hatena.ne.jp/shimooka/20141211/1418298136

普段はphpを使用していますが、scalaにも手を出し始めたことですしせっかくなのでscalaでデザインパターンのひとつ。"FactoryMethodパターン"を実装していきたいと思います。

まずFactoryMethodパターンとはどういったものでしょうか?
上記のサイトやGOF本にはこう記されています。

オブジェクトを生成するときのインタフェースだけを規定して、実際にどのクラスをインスタンス化するかはサブクラスが決めるようにする。Factory Methodパターンは、インスタンス化をサブクラスに任せる。

もう少し簡略化すると

「オブジェクト生成側」と「オブジェクトの利用側」を分離するパターン

ということらしいです。

このデザインパターンを実装することで何がメリットなのか?分離してどうなるのか?

一番わかりやすい例としては
・ FactoryMethodパターンを利用している側にいちいちnewを書かなくていい
が挙げられます。

オブジェクトを利用する側は、オブジェクト生成側が返してくれるインスタンスを利用するだけでいい。
後々のメンテナンスでも便利です。分離しているおかげでオブジェクトの生成側に問題がある場合でも利用する側はコードの変更がなくて済みます。

それではscalaで実装していきます。

Factory.scala
trait Factory {
  def create(): Character

}

object CharacterFactory extends Factory {
  override def create(): Character = {
    val character = new Character
    return character
  }
}

object MonsterFactory extends Factory {
  override def create(): Character = {
    val monster = new Monster
    return monster
  }
}

Main.scala

object Main {

  def main(args: Array[String]): Unit = {
    val name = io.StdIn.readLine()
    val character = CharacterFactory.create()
    val monster = MonsterFactory.create()
  }

}

分離できているので利用側ではインスタンスを生成する際にnewをしていませんね。メンテナンスしやすそうです。

参考

http://d.hatena.ne.jp/shimooka/20141211/1418298136
https://qiita.com/shoheiyokoyama/items/d752834a6a2e208b90ca