๋์์ธ ํจํด(Design Pattern): ๋ฐฉ์์ ํตํด ์ํํธ์จ์ด ์ค๊ณ์์ ์ป์ ์ธ์ธํ ๊ฒฝํ๋ค์ ๊ธฐ๋กํด ๋๋๋ก ํ๋ ๊ฒ
-ํจํด "์ด๋ค ์ํฉ์ ๋ฌธ์ ์ ๋ํ ํด๋ฒ"
-๊ฐ๋ฐ์๋ค์ด ๊ฐ๋ฐ์ ํ๋ฉด์ ํ๋ก๊ทธ๋จ์ ์ ์ฐ์ฑ๊ณผ ํ์ฅ์ฑ๊ณผ ๊ด๋ จ๋ ๋น์ทํ ๋ฌธ์ ๋ค์ ๋ง์ฃผํ๋ฉฐ, ์ด ๋ฌธ์ ๋ค์ ํ๊ธฐ ์ํด์ ๋ง์ ์๊ฐ์ด ์์๋๋ค. ์ด ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด ์ํํธ์จ์ด ๋์์ธ ํจํด์ด๋ค.
-๊ฐ๋ฐ์ ํ๋ฉด์ ์๊ธธ ์ ์๋ ๋ฌธ์ ๋ฅผ ์ ํ๋ณ๋ก ๋๋ ์ ํด๊ฒฐ์ฑ
์ ์ ์ํ๋ค.
ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ๊ฐ๋ค์ ๋์์ธ ํจํด์ ์ฅํฉํ๊ฒ ์ค๋ช
ํ์ง ์๊ณ , ๋์์ธ ํจํด ๊ทธ ์์ฒด์ ์ด๋ฆ๋ง์ ๋งํด์ ํ๋ก๊ทธ๋จ ์ค๊ณ์ ๋ณต์ก๋๋ฅผ ์ค์ธ๋ค.๋ ์์ฌ์ํต์ ํธ๋ฆฌํจ์ ์ค๋ค.
1) ํจํด ์ด๋ฆ๊ณผ ๋ถ๋ฅ(Pattern Name and Classification)
ํ๋์ ํจํด์ ๋ถ์ ์ด๋ฆ์ ๊ทธ ์์ฒด๊ฐ ํต์ฌ์ ๊ฐ๊ฒฐํ๊ฒ ์ ๋ฌํด ์ค๋ค. ๊ฐ๋ฐ์๊ฐ ์ค๊ณ๋ฅผ ํ ๋ ์ง์ ์ฌ์ฉํ ๋จ์ด์ด๊ธฐ ๋๋ฌธ์ ์ข์ ์ด๋ฆ์ ํจํด์ ์๋ช
์ด๋ค. ํจํด์ ๋ถ๋ฅ๋ ํจํด์ ๊ตฌ์ฑ๋ฐฉ์์ ๋ฐ์ํ๋ค.
2) ์๋(Intent)
์ด ๋์์ธ ํจํด์ ๋ฌด์์ ํ๋ ๊ฐ? ์๋์ ๋
ผ๋ฆฌ์ ์ธ ๊ทผ๊ฑฐ๊ฐ ๋ฌด์์ธ๊ฐ? ์ด๋ค ํน์ ํ ๋ฌธ์ ๋ ์ด์๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๊ฒ์ผ๊น์? ๋ผ๋ ์ง๋ฌธ์ ๊ฐ๊ฒฐํ ๋ต์ ์ ์ํ๋ ๋ถ๋ถ์ด๋ค.
3) ๋ค๋ฅธ ์ด๋ฆ(Also Known As)
์ด ํจํด์ ๋ค๋ฅด๊ฒ ๋ถ๋ฅด๋ ์ด๋ฆ์ด ์๋ค๋ฉด ๊ทธ๊ฒ์ ์ ์ ํ๋ค.
4) ๋๊ธฐ(Motivation)
์ค๊ณ ๋ฌธ์ ๋ฅผ ์ ์ํ๊ณ , ํจํด์์์ ํด๋์ค๋ ๊ฐ์ฒด ๊ตฌ์กฐ๊ฐ ์ด๋ป๊ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ง ์ค๋ช
ํด์ฃผ๋ ์ผ์ข
์ ์๋๋ฆฌ์ค ์ด ์๋๋ฆฌ์ค๋ ํจํด์ ๋ํ ์ข ๋ ์ถ์ํ๋ ์ค๋ช
์ ์ดํดํ ์ ์๊ฒ ๋์ ์ค๋ค.
5) ํ์ฉ์ฑ(Applicability)
ํด๋น ํจํด์ ์ด๋ค ์ํฉ์ ์ ์ฉํ ์ ์์๊น? ํจํด์ด ๋ฌธ์ ๋ก ์ผ๋ ์๋ชป๋ ์ค๊ณ์๋ ๋ฌด์์ผ๊น? ์ด ์ํฉ์ ์ด๋ป๊ฒ ํ์
ํ ์ ์์๊น?
6) ๊ตฌ์กฐ(Structure)
๊ฐ์ฒด ๋ชจ๋ธ๋ง ๊ธฐ๋ฒ(Object Modeling Technique)1์ ๊ธฐ๋ฐ์ ๋ ํ๊ธฐ๋ฒ์ ์ด์ฉํ์ฌ ํด๋น ํจํด์์ ์ฐ๋ ํด๋์ค๋ค์ ์๊ฐ์ ์ผ๋ก ๋ํ๋ธ๋ค ๋ํ ๊ฐ์ฒด ์ฌ์ด์ ์ค๊ฐ๋ ์์ฒญ๊ณผ ํ๋ ฅ ๊ด๊ณ์ ์์ฐจ๋ฅผ ํํํ๊ธฐ ์ํด์ ์ํธ์์ฉ ๋ค์ด์ด๊ทธ๋จ์ ์ฌ์ฉํ๋ค.
7) ์ฐธ์ฌ์(Participant)
์ฃผ์ด์ง ํจํด์ ๊ตฌ์ฑํ๊ณ ์ฑ
์์ ์ํํ๋ ํด๋์ค๋ ๊ฐ์ฒด๋ค์ ์ค๋ช
ํ๋ค.
8) ํ๋ ฅ๋ฐฉ๋ฒ(Collaboration)
์ฐธ์ฌ์๋ค์ด ์์
์ ์ํํ๊ธฐ ์ํ ์ฐธ์ฌ์๋ค ๊ฐ์ ํ๋ ฅ๊ด๊ณ๋ฅผ ์ ์ํ๋ค.
9) ๊ฒฐ๊ณผ(Consequence)
์ด ํจํด์ด ์์ ์ ๋ชฉํ๋ฅผ ์ด๋ป๊ฒ ์ง์ํ ๊น? ์ด ํจํด์ ์ด์ฉํ ๊ฒฐ๊ณผ๋ ๋ฌด์์ด๊ณ ์ฅ๋จ์ ์ ๋ฌด์? ์ด ํจํด์ ์ฌ์ฉํ๋ฉด ์์คํ
๊ตฌ์กฐ์ ์ด๋ค ๋ฉด์ ๋
๋ฆฝ์ ์ผ๋ก ๋ค์ํ ์ํฌ์ ์์๊น?
10) ๊ตฌํ(Implementation)
ํจํด์ ๊ตฌํํ ๋ ์ฃผ์ํด์ผ ํ ํจ์ , ํํธ, ๊ธฐ๋ฒ๋ฑ์ ๋ฌด์? ํน์ ์ธ์ด์ ๊ตญํ๋ ํน์ด์ฌํญ์ ๋ฌด์?
11) ์์ ์ฝ๋(Sample Code)
์ฃผ์ด์ง ํจํด์ ์ค์ ๋ก C++๋ ์ค๋ชฐํ ํฌ๋ฅผ ์ด์ฉํด์ ์ด๋ป๊ฒ ๊ตฌํํ ์ ์๋๊ฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ฝ๋
12) ์ ์๋ ค์ง ์ฌ์ฉ ์(Known Use)
์ค์ ์์คํ
์์ ์ฐพ์๋ณผ ์ ์๋ ํจํด๋ค์ ์๋ก์ ์๋ก ๋ค๋ฅธ ๊ฐ๋ฐ ๋ถ์ผ์์๋ ์ฐ๋ ์์ ๋ฅผ ๋ ๊ฐ์ง ์ด์ ํฌํจ ์์ผฐ๋ค
13) ๊ด๋ จ ํจํด(Related Pattern)
์ด ํจํด๊ณผ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋ ๋ค๋ฅธ ํจํด๋ค์ ๋ฌด์? ์ด๋ค์ ์ค์ํ ์ฐจ์ด์ ์ ๋ฌด์? ์ด๋ค ๋ค๋ฅธ ํจํด์ ์ด ํจํด์ด ์ฌ์ฉ๋์ด ์ง๊น?
:๊ฐ์ฒด๊ฐ์ ๊ณตํต๋ ์ปค๋ฎค๋์ผ์ด์
ํจํด์ ์์๋ด๊ธฐ ์ํ ๋์์ธ ํจํด
-> ์ด ๋์์ธ ํจํด์ผ๋ก ์ปค๋ฎค๋์ผ์ด์
์ ์ํํ ๋ ์ ์ฐ์ฑ์ ๋์ผ ์ ์๋ค.
-์ด๋ค ์ฒ๋ฆฌ์ ์ฑ
์์ ์ด๋ ๊ฐ์ฒด์ ํ ๋นํ๊ฑฐ๋,
์๊ณ ๋ฆฌ์ฆ์ ์ด๋ค ๊ฐ์ฒด์ ์ ์ํ๋๊ฒ ์ข์์ง ์ ํ๋ ํจํด!
1. Observer
Observer ํจํด์ ๊ฐ์ฒด๊ฐ ์ํ์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฒ์ํ ์ ์๋๋ก ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค. ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ฆ๊ฐ์ ์ผ๋ก ์๊ธฐ ์ํด ๊ตฌ๋
ํ๊ณ ์๋ค.
=> ๋ณํํ๋ ๋ฐ์ดํฐ์ ๋ฐ์ํ๋ ํ๋ก๊ทธ๋จ = ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋จ
(์ด์ ์๋ ๋ช
๋ นํ ํ๋ก๊ทธ๋จ)
-์ต์ ๋ฒ ํจํด์ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ์ด๊ฐ ๋๋ค. ๋ฐ์ดํฐ์ ๋ณํ๋ฅผ ๊ด์ฐฐํ๋ฉฐ, ๊ด์ฐฐํ ๋ณํ๋ฅผ ํ์ํ ๊ณณ์ ์๋ฆฐ๋ค.
-๋ฐํ์(๋ณํํ๋ ๋ฐ์ดํฐ), ๊ตฌ๋
์(๋ฐ์ดํฐ์ ๋ณํ๋ฅผ ๊ด์ฐฐํด ํ์ํ ๋์ ์ํ)๋ก ๊ตฌ์ฑ๋๋ค.
var data: String by Delegates.observable(
initialValue="",
onChange = { property: KProperty<*>, oldValue: String, newValue: String ->
println("Data Changed >> from ${oldValue} to ${newValue}")
}
)
//onChange์ ๋๋ค์ = ๊ตฌ๋ ์, data = ๋ฐํ์
2. Strategy
Strategy ํจํด์ ์์
์ฒ๋ฆฌ ๊ณผ์ ์์ ํ์์ ๋ฐ๋ผ ์ ํํ ์ ์๋ ๊ต์ฒด๊ฐ ๊ฐ๋ฅํ ์๊ณ ๋ฆฌ์ฆ์ ๋ง๋๋ ๋ฐ์ ์ฌ์ฉ๋๋ค.
-ํ๋์ ๊ฐ์ฒด๊ฐ ๋ค์ํ๋ฉด์ ๋ณํํ๋ ์ญํ ์ ํ ๋ ์ฌ์ฉ๋๋ค.
ex) ์ด๋ฉ์ผ์ ๋ณด๋ผ ๋, ์ด๋ฉ์ผ์๋ ์์๋ง๊ณผ ๋งบ์๋ง์ด ๋ค์ด๊ฐ๋ฉฐ, ์ฌ๋๋ง๋ค ์ด๋ฅผ ๋ค๋ฅด๊ฒ ์ค์ ํ ์ ์์ด์ผ ํ๋ค.
class MessageConverter(private var messageGenerateStrategy: MessageGenerateStrategy){
fun convert(string: String): String{
return messageGenerateStrategy.process(string)
}
//MessageGenerateStrategy์ ์ ๋ต์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ฝ๋๋ฅผ ๋ง๋ค์ด๋ธ๋ค.
fun setStrategy(messageGenerateStrategy: MessageGenerateStrategy) {
this.messageGenerateStrategy = messageGenerateStrategy
}
//MessageGenerateStrategy๋ฅผ ๋์ ์ผ๋ก ๋ฐ๊พผ๋ค.
}
fun main(){
val message = "Hello"
val fromIOSStrategy = MessageGenerateStrategy.Etc { message : String -> "${message} : Written from IOS" }
val messageConverter = MessageConverter(fromIOSStrategy)
println(messageConverter.convert(message))
//Hello : Written from IOS
val messageHeaderStrategy = MessageGenerateStrategy.AttachHeader("Message : ")
messageConverter.setStrategt(messageHeaderStrategy)
println(messageConverter.convert(message))
//Message : Hello
์์ฑ ํจํด(creational pattern)์ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ์ ์ฐจ๋ฅผ ์ถ์ํํ๋ ํจํด์ ๋๋ค. ์ด ๋ฒ์ฃผ์ ํด๋นํ๋ ํจํด์ ๊ฐ์ฒด๋ฅผ ์์ฑ ํฉ์ฑํ๋ ๋ฐฉ๋ฒ์ด๋ ๊ฐ์ฒด์ ํํ ๋ฐฉ๋ฒ๊ณผ (์ํํธ์จ์ด) ์์คํ ์ ๋ถ๋ฆฌํด ์ค๋๋ค.
1) ํด๋์ค ์์ฑ ํจํด - ์ธ์คํด์ค๋ก ๋ง๋ค ํด๋์ค๋ฅผ ๋ค์ํ๊ฒ ๋ง๋ค๊ธฐ ์ํ ์ฉ๋๋ก ์์์ ์ฌ์ฉํจ
2) ๊ฐ์ฒด ์์ฑ ํจํด - ์ธ์คํด์คํ ์์
์ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ๋ ๋๊น
์์ฑ ํจํด์ ํน์ง
์์ฑ ํจํด์ ์์คํ ์ด ์ด๋ค ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ์ง์ ๋ํ ์ ๋ณด๋ฅผ ์บก์ํํฉ๋๋ค. ์์ฑ ํจํด์ ์ด๋ค ํด๋์ค์ ์ธ์คํด์ค๋ค์ด ์ด๋ป๊ฒ ๋ง๋ค๊ณ ์ด๋ป๊ฒ ์๋ก ๋ง๋ถ๋์ง์ ๋ํ ๋ถ๋ถ์ ์์ ํ ์จ๊น๋๋ค. ์์ฑ ํจํด์ ์ด์ฉํ๋ฉด ๋ฌด์์ด ์์ฑ๋๊ณ ๋๊ฐ ์ด๊ฒ์ ์์ฑํ๋ฉฐ, ์ด๊ฒ์ด ์ด๋ป๊ฒ ์์ฑ๋๋์ง, ์ธ์ ์์ฑํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ๋ ๋ฐ ์ ์ฐ์ฑ์ ํ๋ณดํ ์ ์๊ฒ ๋ฉ๋๋ค.
1. Abstract Factory ์ถ์ ํฉํ ๋ฆฌ
:์์ธํ๋ ์๋ธํด๋์ค๋ฅผ ์ ์ํ์ง ์๊ณ ๋ ์๋ก ๊ด๋ จ์ฑ์ด ์๊ฑฐ๋ ๋
๋ฆฝ์ ์ธ ์ฌ๋ฌ ๊ฐ์ฒด์ ๊ตฐ์ ์์ฑํ๊ธฐ ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค
์ฉ๋:
-๊ด๋ จ๋ ์ ํ ๊ฐ์ฒด๋ค์ด ํจ๊ป ์ฌ์ฉ๋๋๋ก ์ค๊ณ๋์๊ณ , ์ด๋ถ๋ถ์ ๋ํ ์ ์ฝ์ด ์ธ๋ถ์๋ ์ง์ผ์ง๋๋ก ํ๊ณ ์ถ์ ๋
2. Builder
-๋ง์ ๋ณ์(์ธ์)๋ฅผ ๊ฐ์ง ๊ฐ์ฒด ์์ฑ์ ๋์ ํด์ค๋ค.
-์ฌ์ฉ์๊ฐ ์ด ๊ณผ์ ์์ ์ปค์คํ
๊ฐ๋ฅํ๋ค. (ํฉํ ๋ฆฌ ํจํด์ ๋ถ๊ฐ๋ฅํ๋ค.)
-๊ฐ๋
์ฑ์ด ์ข๋ค. (๊ฐ ์ธ์์ ์๋ฏธ๋ฅผ ํ์
ํ๊ธฐ ์ฝ๋ค)
-ํ์ ๋งค๊ฐ๋ณ์, ์ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋๋ณด๋ค ์ ์ฐํ๊ธฐ ํ์ฉํ ์ ์๋ค.
3. Factory Method
-๊ณต์ฅ์ฒ๋ผ ํน์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๋ฐํํ๋ ๊ฒฝ์ฐ
Factory Method Pattern vs Abstract Factory Pattern
1. Composite
-์ปดํฌ์ง ํจํด์ ํด๋ผ์ด์ธํธ๊ฐ ๋ณตํฉ ๊ฐ์ฒด๋ ๋จ์ผ ๊ฐ์ฒด๋ฅผ ๋์ผํ๊ฒ ์ทจ๊ธํ๋ ๊ฒ์ ๋ชฉ์ ์ผ๋ก ํ๋ค. ์ปจํ
์ด๋์ ๋ด์ฉ๋ฌผ์ ๋์ผ์ ํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
=> ์ฆ, ์ํ๊ด๊ณ๊ฐ ์๋ ๊ฐ์ฒด๋ค์ ๋์ผํ๊ฒ ์ทจ๊ธํ ์ ์๋๋ก ํ๋ ํจํด.
๋ชจ๋ ๋ผ์ด๋๋ค๋ฐฐ๋ฌ()
์ ๊ท์ง๋ผ์ด๋ ์ ๊ท์ง๋ผ์ด๋ = new ์ ๊ท์ง๋ผ์ด๋()
ํํธํ์๋ผ์ด๋ ํํธํ์๋ผ์ด๋ = new ํํธํ์๋ผ์ด๋()
๋ฐฐ๋ฏผ์ปค๋ฅํธ๋ผ์ด๋ ๋ฐฐ๋ฏผ์ปค๋ฅํธ๋ผ์ด๋ = new ๋ฐฐ๋ฏผ์ปค๋ฅํธ๋ผ์ด๋()
์ ๊ท์ง๋ผ์ด๋.๋ฐฐ๋ฌ()
ํํธํ์๋ผ์ด๋.๋ฐฐ๋ฌ()
๋ฐฐ๋ฏผ์ปค๋ฅํธ๋ผ์ด๋.๋ฐฐ๋ฌ()
...
=> composite pattern ํ์ฉ
๋ชจ๋ ๋ผ์ด๋๋ค๋ฐฐ๋ฌ()
for (๋ผ์ด๋ : ๋ผ์ด๋๋ฆฌ์คํธ)
๋ผ์ด๋.๋ฐฐ๋ฌ()
-๊ฐ์์ ์๊ด์์ด ์ผ๊ด์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , ์ฝ๋๊ฐ ๋จ์ํด์ง๋ค!
-์๋ก์ด ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ฉ์ดํ๋ค.
-๋จ, ์ฌ๋ฌ ์ข
๋ฅ์ ๊ฐ์ฒด๋ฅผ ์ผ๋ฐํํ๊ธฐ ๋๋ฌธ์, ํน์ ๊ฐ์ฒด์ ์ ์ฝ ์กฐ๊ฑด์ ์ค ์ ์๋ค.
=> ๊ฐ์ฒด์ ๊ตฌ์ฑ, ๊ฐ๋ณ ๊ฐ์ฒด ๊ฐ์ ์ฐจ์ด๋ฅผ ๋ฌด์ํ ๋ ์จ์ผ ํ๋ค.
๋์์ธ์ ์ง๋์น๊ฒ ์ผ๋ฐ์ ์ผ๋ก ๋ง๋ค ์ ์๋ค.
4. Decorator
๊ณต๋ถํ ์๋ก ๋์์ธ ํจํด๋ค์ด ๋ช
ํํ ๊ตฌ๋ถ๋์ด ์์ง ์๊ณ ,
์ฉ๋๋ ๊ธฐ๋ฅ์ด ์ค์ฒฉ๋๋ ๋ถ๋ถ๋ ๋ง์
๊ทธ๋๊ทธ๋ ํ์ํ ์ฉ๋์ ๋ฐ๋ผ ์ ํํด์ ์ฌ์ฉํ๋ ๊ฑด ๊ฐ๋ฐ์์ ๋ชซ์ด๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.
์ฐธ์กฐ:
https://onlyfor-me-blog.tistory.com/434?category=905380