feat : Design Pattern - 추상 팩토리 패턴(Abstract Factory) 패턴 구현

This commit is contained in:
banjjoknim
2022-11-12 19:28:33 +09:00
parent 21937f8dc8
commit 6b2c3eced2
11 changed files with 171 additions and 0 deletions

View File

@@ -135,6 +135,12 @@
### 추상 팩토리(Abstract Factory) 패턴
#### 구현 요구사항
- 과일 이름을 입력하면 해당 과일 또는 과일주스를 만들어주는 마법이 있다.
- 과일의 종류는 사과, 바나나, 오렌지로 총 세 가지다.
- 과일주스의 종류도 마찬가지로 사과주스, 바나나주스, 오렌즈주스로 총 세 가지다.
### 컴포지트(Composite) 패턴
### 널(Null) 객체 패턴

View File

@@ -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}]을 만들었습니다!")
}
}

View File

@@ -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}]을 만들었습니다!")
}
}

View File

@@ -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()
//}

View File

@@ -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()
}

View File

@@ -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}]을 만들었습니다!")
}
}

View File

@@ -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}]을 만들었습니다!")
}
}

View File

@@ -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)
}

View File

@@ -0,0 +1,7 @@
package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common
enum class FruitType {
APPLE,
BANANA,
ORANGE
}

View File

@@ -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

View File

@@ -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