diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md b/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md index 8243061..78964e1 100644 --- a/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md @@ -135,6 +135,12 @@ ### 추상 팩토리(Abstract Factory) 패턴 +#### 구현 요구사항 + +- 과일 이름을 입력하면 해당 과일 또는 과일주스를 만들어주는 마법이 있다. +- 과일의 종류는 사과, 바나나, 오렌지로 총 세 가지다. +- 과일주스의 종류도 마찬가지로 사과주스, 바나나주스, 오렌즈주스로 총 세 가지다. + ### 컴포지트(Composite) 패턴 ### 널(Null) 객체 패턴 diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/AppleMagic.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/AppleMagic.kt new file mode 100644 index 0000000..4c9a14f --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/AppleMagic.kt @@ -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}]을 만들었습니다!") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/BananaMagic.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/BananaMagic.kt new file mode 100644 index 0000000..3e2ff42 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/BananaMagic.kt @@ -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}]을 만들었습니다!") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/Magic.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/Magic.kt new file mode 100644 index 0000000..2619de6 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/Magic.kt @@ -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() +//} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/MagicApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/MagicApplication.kt new file mode 100644 index 0000000..8b84596 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/MagicApplication.kt @@ -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() +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/OrangeMagic.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/OrangeMagic.kt new file mode 100644 index 0000000..416a5c7 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/OrangeMagic.kt @@ -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}]을 만들었습니다!") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/before/Magic.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/before/Magic.kt new file mode 100644 index 0000000..c862ffe --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/before/Magic.kt @@ -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}]을 만들었습니다!") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/before/MagicApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/before/MagicApplication.kt new file mode 100644 index 0000000..8024408 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/before/MagicApplication.kt @@ -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) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/common/FruitType.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/common/FruitType.kt new file mode 100644 index 0000000..75c7333 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/common/FruitType.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common + +enum class FruitType { + APPLE, + BANANA, + ORANGE +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/common/Fruits.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/common/Fruits.kt new file mode 100644 index 0000000..e83951a --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/common/Fruits.kt @@ -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 diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/common/Juices.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/common/Juices.kt new file mode 100644 index 0000000..2f266f3 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/common/Juices.kt @@ -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