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:
valcat=Animal("cat")// creates a Catvaldog=Animal("dog")// creates a Dog
To implement this behavior, create a parent Animal trait:
traitAnimal{defspeak}
In the same file, create (a) a companion object, (b) the classes
that extend the base trait, and (c) a suitable apply method:
objectAnimal{privateclassDogextendsAnimal{overridedefspeak{println("woof")}}privateclassCatextendsAnimal{overridedefspeak{println("meow")}}// the factory methoddefapply(s:String):Animal={if(s=="dog")newDogelsenewCat}}
This lets you run the desired code:
valcat=Animal("cat")// returns a Catvaldog=Animal("dog")// returns a Dog
You can test this by pasting the Animal trait and object into the REPL, and then issuing these ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access