Skip to content

Instantly share code, notes, and snippets.

@sombochea
Last active October 13, 2020 05:39
Show Gist options
  • Save sombochea/827975c96a6858f0f7af0634cd7ab2a1 to your computer and use it in GitHub Desktop.
Save sombochea/827975c96a6858f0f7af0634cd7ab2a1 to your computer and use it in GitHub Desktop.
Simple Factory Pattern on Kotlin
package com.cubetiqs.factory
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
class FactoryTests {
@Test
fun factoryTest() {
val carA = CarFactory(CarType.CAR_A).getCar()
Assertions.assertEquals("Car A", carA.getName())
Assertions.assertEquals(1, carA.getId())
val carB = CarFactory.getFactory(CarType.CAR_B).getCar() as CarB
Assertions.assertEquals("Car B", carB.getName())
Assertions.assertEquals(2, carB.getId())
Assertions.assertEquals(2020, carB.year)
if (Factory.existBean("carC")) {
val carC = Factory.getBean("carC") as CarC
Assertions.assertEquals(3, carC.getId())
Assertions.assertEquals("Car C", carC.getName())
Assertions.assertEquals("Mezeda", carC.brand)
} else {
println("no factory for car c found!")
}
}
}
enum class CarType { CAR_A, CAR_B, CAR_C }
object Factory {
private val containers: MutableMap<String, Any?> = mutableMapOf(
"carA" to CarFactory.getFactory(CarType.CAR_A).getCar(),
"carB" to CarFactory.getFactory(CarType.CAR_B).getCar(),
"carC" to CarFactory.getFactory(CarType.CAR_C).getCar(),
)
fun existBean(beanName: String): Boolean = containers.containsKey(beanName)
fun getBean(beanName: String): Any? = containers[beanName]
}
class CarFactory (private val type: CarType) {
fun getCar(): ICar {
return when (type) {
CarType.CAR_A -> CarA(1, "Car A")
CarType.CAR_B -> CarB(2, "Car B", 2020)
CarType.CAR_C -> CarC(3, "Car C", "Mezeda")
}
}
companion object {
fun getFactory(type: CarType): CarFactory {
return CarFactory(type)
}
}
}
interface ICar {
fun getId(): Long
fun getName(): String
}
open class Car(private val id: Long, private val name: String) : ICar {
override fun getId(): Long {
return id
}
override fun getName(): String {
return name
}
}
open class CarA(id: Long, name: String) : Car(id, name)
class CarB(id: Long, name: String, var year: Int) : CarA(id, name)
class CarC(id: Long, name: String, var brand: String) : Car(id, name)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment