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.