Last active
October 13, 2020 05:39
-
-
Save sombochea/827975c96a6858f0f7af0634cd7ab2a1 to your computer and use it in GitHub Desktop.
Simple Factory Pattern on Kotlin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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