What if you could create objects with a simple call, no matter how many types you add later?
Why Factory pattern with companion objects in Kotlin? - Purpose & Use Cases
Imagine you want to create different types of vehicles in your app, like cars and bikes. You write separate code everywhere to make each one, repeating similar steps again and again.
This manual way is slow and messy. If you want to add a new vehicle type, you must change many parts of your code. It's easy to make mistakes and hard to keep track of all the creation details.
The factory pattern with companion objects lets you centralize the creation logic inside the class itself. You just call a simple method to get the right vehicle, and the class handles the details. This keeps your code clean and easy to update.
val car = Car("red") val bike = Bike("blue")
val car = Vehicle.create("car", "red") val bike = Vehicle.create("bike", "blue")
This pattern makes your code flexible and easy to extend, so you can add new types without changing the rest of your program.
Think of a game where you create different characters. Using a factory with companion objects, you just ask for a character type, and the game gives you the right one without extra hassle.
Manual creation is repetitive and error-prone.
Factory pattern centralizes object creation inside the class.
Companion objects make it easy to call factory methods without extra classes.
Practice
companion object in Kotlin's factory pattern?Solution
Step 1: Understand companion objects
Companion objects in Kotlin are used to hold methods and properties related to the class but not tied to an instance.Step 2: Role in factory pattern
In the factory pattern, companion objects provide factory methods to create instances, especially when constructors are private.Final Answer:
To provide a place for factory methods that create instances -> Option AQuick Check:
Companion object = factory methods [OK]
- Thinking companion objects store instance variables
- Confusing companion objects with inheritance
- Believing companion objects allow multiple constructors
Solution
Step 1: Recall Kotlin constructor syntax
In Kotlin, the constructor keyword follows the class name, and modifiers like private come before constructor.Step 2: Identify correct placement
The correct syntax places 'private' before 'constructor()' right after the class name.Final Answer:
class MyClass private constructor() {} -> Option BQuick Check:
Private constructor syntax = class MyClass private constructor() {} [OK]
- Placing 'private' after constructor parentheses
- Putting 'private' before class keyword
- Misordering 'constructor' and 'private'
class Product private constructor(val name: String) {
companion object {
fun create(name: String): Product {
return Product(name)
}
}
}
fun main() {
val p = Product.create("Book")
println(p.name)
}Solution
Step 1: Understand private constructor usage
The class Product has a private constructor, so instances cannot be created directly outside the class.Step 2: Use of companion object factory method
The companion object provides a create() method that calls the private constructor and returns a Product instance.Step 3: Output of main function
In main(), Product.create("Book") creates an instance with name "Book". Printing p.name outputs "Book".Final Answer:
Book -> Option AQuick Check:
Factory method returns instance with name "Book" [OK]
- Expecting compilation error due to private constructor
- Thinking create() returns null
- Confusing runtime exception with private constructor
class User private constructor(val id: Int) {
companion object {
fun create(id: Int): User {
User(id)
}
}
}Solution
Step 1: Check create() method body
The create() method calls User(id) but does not return the created object.Step 2: Understand Kotlin function return rules
Functions must explicitly return a value unless they are Unit (void). Here, create() should return the new User instance.Final Answer:
Missing return statement in create() method -> Option DQuick Check:
Factory method must return created object [OK]
- Assuming constructor can't be private for companion access
- Placing factory method outside companion object
- Forgetting return keyword in factory method
class Device private constructor(val model: String) {
companion object {
fun create(model: String): Device {
return Device(model)
}
}
}Solution
Step 1: Understand the problem
The factory method should handle invalid input by returning a default instance instead of failing.Step 2: Modify create() method
Add a check: if model is empty, return Device("Unknown"), else return Device(model).Step 3: Why this works
This approach keeps constructor private, centralizes instance creation, and handles invalid input gracefully.Final Answer:
Add a condition in create() to return Device("Unknown") if model is empty -> Option CQuick Check:
Factory method handles invalid input with default instance [OK]
- Making constructor public defeats factory pattern
- Throwing exception instead of default instance
- Removing companion object loses factory benefits
Ready to prove it?
Pass the test and this pattern moves unknown
