6.9. Implement the Factory Method in Scala with apply

Problem

To let subclasses declare which type of object should be created, and to keep the object creation point in one location, you want to implement the factory method in Scala.

Solution

One approach to this problem is to take advantage of how a Scala companion object’s apply method works. Rather than creating a “get” method for your factory, you can place the factory’s decision-making algorithm in the apply method.

For instance, suppose you want to create an Animal factory that returns instances of Cat and Dog classes, based on what you ask for. By writing an apply method in the companion object of an Animal class, users of your factory can create new Cat and Dog instances like this:

val cat = Animal("cat")  // creates a Cat
val dog = Animal("dog")  // creates a Dog

To implement this behavior, create a parent Animal trait:

trait Animal {
  def speak
}

In the same file, create (a) a companion object, (b) the classes that extend the base trait, and (c) a suitable apply method:

object Animal {

  private class Dog extends Animal {
    override def speak { println("woof") }
  }

  private class Cat extends Animal {
    override def speak { println("meow") }
  }

  // the factory method
  def apply(s: String): Animal = {
    if (s == "dog") new Dog
    else new Cat
  }
}

This lets you run the desired code:

val cat = Animal("cat")  // returns a Cat
val dog = Animal("dog")  // returns a Dog

You can test this by pasting the Animal trait and object into the REPL, and then issuing these ...

Get Scala Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.