feat : Design Pattern - 추상 팩토리 패턴(Abstract Factory) 패턴 구현
This commit is contained in:
@@ -135,6 +135,12 @@
|
||||
|
||||
### 추상 팩토리(Abstract Factory) 패턴
|
||||
|
||||
#### 구현 요구사항
|
||||
|
||||
- 과일 이름을 입력하면 해당 과일 또는 과일주스를 만들어주는 마법이 있다.
|
||||
- 과일의 종류는 사과, 바나나, 오렌지로 총 세 가지다.
|
||||
- 과일주스의 종류도 마찬가지로 사과주스, 바나나주스, 오렌즈주스로 총 세 가지다.
|
||||
|
||||
### 컴포지트(Composite) 패턴
|
||||
|
||||
### 널(Null) 객체 패턴
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.after
|
||||
|
||||
import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.Apple
|
||||
import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.AppleJuice
|
||||
|
||||
class AppleMagic : Magic {
|
||||
override fun createFruit() {
|
||||
val apple = Apple()
|
||||
println("과일 [${apple.name}]를 만들었습니다!")
|
||||
}
|
||||
|
||||
override fun createJuice() {
|
||||
val appleJuice = AppleJuice()
|
||||
println("과일주스 [${appleJuice.name}]을 만들었습니다!")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.after
|
||||
|
||||
import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.Banana
|
||||
import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.BananaJuice
|
||||
|
||||
class BananaMagic : Magic {
|
||||
override fun createFruit() {
|
||||
val banana = Banana()
|
||||
println("과일 [${banana.name}]를 만들었습니다!")
|
||||
}
|
||||
|
||||
override fun createJuice() {
|
||||
val bananaJuice = BananaJuice()
|
||||
println("과일주스 [${bananaJuice.name}]을 만들었습니다!")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.after
|
||||
|
||||
import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.FruitType
|
||||
|
||||
interface Magic {
|
||||
companion object {
|
||||
fun getMagic(fruitType: FruitType): Magic {
|
||||
return when (fruitType) {
|
||||
FruitType.APPLE -> AppleMagic()
|
||||
FruitType.BANANA -> BananaMagic()
|
||||
FruitType.ORANGE -> OrangeMagic()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun createFruit()
|
||||
|
||||
fun createJuice()
|
||||
}
|
||||
|
||||
//abstract class Magic {
|
||||
// companion object {
|
||||
// fun getMagic(fruitType: FruitType): Magic {
|
||||
// return when (fruitType) {
|
||||
// FruitType.APPLE -> AppleMagic()
|
||||
// FruitType.BANANA -> BananaMagic()
|
||||
// FruitType.ORANGE -> OrangeMagic()
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// abstract fun createFruit()
|
||||
//
|
||||
// abstract fun createJuice()
|
||||
//}
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.after
|
||||
|
||||
import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.FruitType
|
||||
|
||||
class MagicApplication
|
||||
|
||||
fun main() {
|
||||
val fruitType = FruitType.APPLE
|
||||
val magic = Magic.getMagic(fruitType)
|
||||
magic.createFruit()
|
||||
magic.createJuice()
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.after
|
||||
|
||||
import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.Orange
|
||||
import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.OrangeJuice
|
||||
|
||||
class OrangeMagic : Magic {
|
||||
override fun createFruit() {
|
||||
val orange = Orange()
|
||||
println("과일 [${orange.name}]를 만들었습니다!")
|
||||
}
|
||||
|
||||
override fun createJuice() {
|
||||
val orangeJuice = OrangeJuice()
|
||||
println("과일주스 [${orangeJuice.name}]을 만들었습니다!")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.before
|
||||
|
||||
import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.Apple
|
||||
import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.AppleJuice
|
||||
import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.Banana
|
||||
import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.BananaJuice
|
||||
import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.FruitType
|
||||
import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.Orange
|
||||
import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.OrangeJuice
|
||||
|
||||
class Magic {
|
||||
fun createFruit(type: FruitType) {
|
||||
val fruit = when (type) {
|
||||
FruitType.APPLE -> Apple()
|
||||
FruitType.BANANA -> Banana()
|
||||
FruitType.ORANGE -> Orange()
|
||||
}
|
||||
println("과일 [${fruit.name}]를 만들었습니다!")
|
||||
}
|
||||
|
||||
fun createJuice(type: FruitType) {
|
||||
val juice = when (type) {
|
||||
FruitType.APPLE -> AppleJuice()
|
||||
FruitType.BANANA -> BananaJuice()
|
||||
FruitType.ORANGE -> OrangeJuice()
|
||||
}
|
||||
println("과일주스 [${juice.name}]을 만들었습니다!")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.before
|
||||
|
||||
import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.FruitType
|
||||
|
||||
class MagicApplication
|
||||
|
||||
fun main() {
|
||||
val magic = Magic()
|
||||
val fruitType = FruitType.APPLE
|
||||
magic.createFruit(fruitType)
|
||||
magic.createJuice(fruitType)
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common
|
||||
|
||||
enum class FruitType {
|
||||
APPLE,
|
||||
BANANA,
|
||||
ORANGE
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common
|
||||
|
||||
interface Fruit {
|
||||
val name: String
|
||||
}
|
||||
|
||||
data class Apple(override val name: String = "사과") : Fruit
|
||||
|
||||
data class Banana(override val name: String = "바나나") : Fruit
|
||||
|
||||
data class Orange(override val name: String = "오렌지") : Fruit
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common
|
||||
|
||||
interface Juice {
|
||||
val name: String
|
||||
}
|
||||
|
||||
data class AppleJuice(override val name: String = "사과주스") : Juice
|
||||
|
||||
data class BananaJuice(override val name: String = "바나나주스") : Juice
|
||||
|
||||
data class OrangeJuice(override val name: String = "오렌지주스") : Juice
|
||||
Reference in New Issue
Block a user