A Class coupled with its Companion Object can be used to implement Factory Pattern. Let us checkout a use case without Case Class
The compiler also generates toString(), hashCode(), equals() & apply() among many methods for the case classscala> :paste
// Entering paste mode (ctrl-D to finish)
// c116 -> a15
//== Understanding Companion object ================
// **Here 'object DbConnector' is a Companion object for
// 'class DbConnector'
class DbConnector {
val url = "jdbc://..."
val db = "mydb"
val user = "myusername"
val pwd = "mypwd"
def connect() = { println ("Connecting to DB...") }
}
object DbConnector {
def apply() = new DbConnector()
}
// ** Note here we are not using new() to create
// an object for 'class DbConnector'. This is an
// example of Factor pattern
val conn = DbConnector()
// Exiting paste mode, now interpreting.
defined class DbConnector
defined module DbConnector
conn: DbConnector = DbConnector@208279af
scala> conn.connect()
Connecting to DB...
A Case class simplifies this process further. The Scala compiler provides Companion object without the need for us to explicitly providing the Companion objectscala> // c116 -> a20
scala> //== Case Class : Compiler creates a Companion object for 'case class'
scala> //== (without us explicity providing a Companion object)
scala> //== there by implementing factor pattern
scala> case class DbConnectorV2 {
| val url = "jdbc://..."
| val db = "mydb"
| val user = "myusername"
| val pwd = "mypwd"
| def connect() = { println ("Connecting to DB...") }
| }
warning: there were 1 deprecation warning(s); re-run with -deprecation for details
defined class DbConnectorV2
scala> // ** Note : Here also we are not using new(). So this is an example
scala> // of factory pattern
scala> val conn = DbConnectorV2()
conn: DbConnectorV2 = DbConnectorV2()
scala> conn.connect()
Connecting to DB...
No comments:
Post a Comment