λͺ¨λ μ½λλ Swiftλ‘ μμ±λμμ΅λλ€.
μμ± ν¨ν΄
μμ± ν¨ν΄μ΄λ GoF λμμΈ ν¨ν΄ μ€ κ°μ²΄λ₯Ό μμ±νλ μ μ°¨λ₯Ό μΆμννλ 5κ°μ§ λμμΈ ν¨ν΄μ λΆλ₯ν κ²μ μΌμ»«λ μ©μ΄μ΄λ€. μμ± ν¨ν΄μ νλμ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ΄ μμλ³΄λ€ μ»΄ν¬μ§μ μ μ¬μ©νλ λ°©ν₯μΌλ‘ μ§ννλ©΄μ λμ± μ€μν΄μ§κ³ μλ€. (μ€μ λ‘ κ΅¬κΈμμ κ°λ°ν νλ‘κ·Έλλ° μΈμ΄μΈ Golang μ μμ μμμ΄λ κ°λ μ΄ μ‘΄μ¬νμ§ μλλ€.)
π μμκ³Ό μ»΄ν¬μ§μ
μμμ Animal - Cat, Dog νΉμ Man - Son, Husband, BoyFriendμ κ°μ΄ IS-A κ΄κ³μΌ λ κ°μ²΄μ κΈ°λ₯μ μ½λμ μ€λ³΅ μμ΄ νμ₯μν¬ μ μλ€.
μ»΄ν¬μ§μ μ Computer - Monitor, Keyboard, Mouseμ κ°μ΄ HAS-A κ΄κ³μΌ λ κ°κ°μ κ°μ²΄λ€μ μ‘°ν©νμ¬ κ°μ²΄μ κΈ°λ₯μ νμ₯μν¬ μ μλ€.
μμμ μκ°ν κ΅κ³Όμμ μμλ‘λ IS-A κ΄κ³μ HAS-A κ΄κ³λ₯Ό λͺ ννκ² νλ¨ν μ μμ§λ§, μ€μ μννΈμ¨μ΄λ₯Ό κ°λ°ν λμλ μ΄λ¬ν κ΄κ³λ€μ λν νλ¨μ νκΈ° μ½μ§ μλ€. μλ₯Ό λ€μ΄, HttpResponseλΌλ κ°μ²΄μ κΈ°λ₯μ νμ₯μμΌ ClientHttpResponse, ServerHttpResponseλΌλ κ°μ²΄λ₯Ό λ§λ λ€κ³ μκ°μ ν΄λ³΄μ. HttpResponseμ ClientHttpResponse/ServerHttpResponseμ κ΄κ³κ° IS-A κ΄κ³μΈμ§ HAS-A κ΄κ³μΈμ§ λͺ ννκ² νλ¨ν μ μλ?
class HttpResponse {}
class Client{}
class Server{}
class ClientHttpResponse: HttpResponse { // μμ
private var client: Client
}
class ClientHttpResponse { // μ»΄ν¬μ§μ
private var client: Client
private var httpResponse: HttpResponse
}
class ServerHttpResponse: HttpResponse {
private var server: Server
}
class ServerHttpResponse {
private var server: Server
private var httpResponse: HttpResponse
}
κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ λν μ§μμ΄ λΆμ‘±ν μ¬λλ€μ λλΆλΆ μμμ μ¬μ©νμ¬ ClientHttpResponse/ServerHttpResponse κ°μ²΄λ₯Ό λ§λ€ κ²μ΄λ€. μμμ μ½λμ μ€λ³΅ μμ΄ ν¨κ³Όμ μΌλ‘ κΈ°λ₯μ νμ₯μν¬ μ μλ κ°λ ₯ν κ°λ μΈλ°, μ νν κ°μ²΄ μ€κ³κ° μ΄λ£¨μ΄μ§μ§ μμ μνμμ 무ν±λκ³ μμμ μ¬μ©νλ€λ©΄ κ°μ²΄ κ°μ κ²°ν©λκ° λμμ§κ³ μΊ‘μνλ₯Ό ν΄μΉ μ μλ λ¬Έμ μ μ΄ λ°μνλ€.
λ°λΌμ, λͺ ννκ² IS-A κ΄κ³λΌκ³ νλ¨ν μ μλ κ²½μ°μλ μμλ³΄λ¨ μ»΄ν¬μ§μ μ μ¬μ©νλ κ²μ΄ λ μ 리νλ€.
ν©ν 리 ν¨ν΄
ν©ν 리 ν¨ν΄μ κ°μ²΄μ μμ± λ‘μ§μ μΆμννλ μμ± ν¨ν΄μ κ·Όκ°μ΄ λλ ν¨ν΄μ΄λ€. μ΄λ¦μμ μ μ μλ―μ΄ μ¬λ¬ κ°μ²΄λ€μ μμ±νλ 곡μ₯ κ°μ²΄λ₯Ό λ§λ€μ΄ μ¬μ©νλ ν¨ν΄μ΄λ€. AnimalFactoryλΌλ 곡μ₯ κ°μ²΄λ₯Ό μμλ₯Ό λ€μ΄ μ½λλ‘ νμΈν΄ 보μ.
AnimalFactory κ°μ²΄ μ½λ
enum AnimalType {
case dog, cat
}
class AnimalFactory { // 곡μ₯ κ°μ²΄
func createAnimal(_ animalType: AnimalType) -> Animal {
switch animalType {
case .cat:
return Cat()
case .dog:
return Dog()
}
}
}
protocol Animal {
func speak()
}
class Cat: Animal {
func speak() {
print("meow")
}
}
class Dog: Animal {
func speak() {
print("bark!")
}
}
AnimalFactory κ°μ²΄ μ¬μ© μμ
class Zoo {
private var animals = [Animal]()
private var animalFactory = AnimalFactory()
func addAnimal(_ animalType: AnimalType) {
let newAnimal = factory.createAnimal(animalType) // κ°μ²΄ μμ± κ³Όμ μ μΆμν
animals.append(newAnimal)
}
func speakAll() {
animals.forEach { $0.speak() }
}
}
let zoo = Zoo()
zoo.addAnimal(AnimalType.cat)
zoo.addAnimal(AnimalType.dog)
zoo.speakAll()
μ μ½λμμ νμΈν΄ λ³Ό μ μλ―μ΄ ν΄λΌμ΄μΈνΈ κ°μ²΄μμ μ§μ μλ² κ°μ²΄μ μΈμ€ν΄μ€λ₯Ό μμ±νλ κ²μ΄ μλλΌ ν©ν 리 κ°μ²΄μκ² κ·Έ μμ μ 맑긴λ€. μ΄μ λ°λΌ μλ² κ°μ²΄μ μμ± λ‘μ§κ³Ό ν΄λΌμ΄μΈνΈ κ°μ²΄μ λΉμ¦λμ€ λ‘μ§μ λΆλ¦¬ν¨μΌλ‘μ¨ λ¨μΌ μ± μ μμΉμ μ€μν μ μκ² λκ³ , μλ² κ°μ²΄ μμ± λ°©λ²μ μμΈν μμ§ μμλ μνλ μλ² κ°μ²΄λ₯Ό μμ²λ§ νλ©΄ μ½κ² λ°μμ¬ μ μλ€.
ν©ν 리 λ©μλ ν¨ν΄
ν©ν 리 λ©μλ ν¨ν΄μ λν΄ μ€λͺ νκΈ° μ΄μ μ ν©ν 리 ν¨ν΄μ λ¬Έμ μ λΆν° μμ보μ. AnimalFactory κ°μ²΄μ createAnimal λ©μλμ μ½λμμ κ°μ²΄ μμ± κ³Όμ μ λΆκΈ° μ²λ¦¬ νκ³ μμμ νμΈν΄ λ³Ό μ μλ€. λΆκΈ° μ²λ¦¬ μ½λ κ°μ΄ κ²½μ§λκ° λμ μ½λλ κ°λ°©-νμ μμΉμ μ€μνμ§ λͺ»νλ€. μ¦, CowλΌλ Animal κ°μ²΄κ° μΆκ°λλ€λ©΄ λΆκΈ° μ²λ¦¬ λ¬Έμ μμ ν΄μ€μΌ νλ€.
μ΄λ¬ν κ²½μ§λ λμ μ½λλ₯Ό κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μμλ μΈν°νμ΄μ€λ₯Ό νμ©νμ¬ νλ² λ μΆμννμ¬ λ€νμ±μ μ΄μ©νλ λ°©μμΌλ‘ ν΄κ²°νλ€.
ν©ν 리 λ©μλ ν¨ν΄μ΄ λ°λ‘ ν©ν 리 ν¨ν΄μμ 곡μ₯ κ°μ²΄λ₯Ό μΈν°νμ΄μ€λ‘ νλ² λ μΆμννμ¬ λ€νμ±μ μ΄μ©νλ λμμΈ ν¨ν΄μ΄λ€.
UML ν΄λμ€ λ€μ΄μ΄κ·Έλ¨
- Creator – Factoryμ κΈ°λ³Έ μν μ μ μνλ κ°μ²΄
- Concrete Creator – Creatorλ₯Ό μ±ννκ³ μμΌλ©° Productμ λ§λ ꡬ체μ κΈ°λ₯μ ꡬν
- Product – Concrete Productκ° ν΄μΌ ν λμλ€μ μ μΈνλ κ°μ²΄
- Concrete Product – Productλ₯Ό μ±ννλ©° κ·Έμ λ§κ² λ§λ μ€μ κ°μ²΄
μ½λ μμ
Productμ Concrete Prouct
protocol Animal { // Product
func speak()
}
class Cat: Animal { // Concrete Product
func speak() {
print("meow")
}
}
class Dog: Animal { // Concrete Product
func speak() {
print("bark")
}
}
Creatorμ Concrete Creator
protocol AnimalFactory { // Creator
func createAnimal() -> Animal // ν©ν 리 λ©μλ μ μΈ
}
class CatCreator: AnimalFactory { // Concrete Creator
func createAnimal() -> Animal { // ν©ν 리 λ©μλ ꡬν
return Cat()
}
}
class DogCreator: AnimalFactory { // Concrete Creator
func createAnimal() -> Animal { // ν©ν 리 λ©μλ ꡬν
return Dog()
}
}
ν΄λΌμ΄μΈνΈ κ°μ²΄ μ¬μ© μμ
class Zoo {
private var animals = [Animal]()
func addAnimal(creator: AnimalFactory) {
let newAnimal = creator.createAnimal() // Concrete Creator μ¬μ©
animals.append(newAnimal)
}
func speakAll() {
animals.forEach { $0.speak() }
}
}
var zoo = Zoo()
zoo.addAnimal(DogCreator())
zoo.addAnimal(CatCreator())
zoo.speakAll()
μ₯μ
ν©ν 리 ν¨ν΄ μ½λμ λΉκ΅ν΄μ 보면 λΆκΈ° μ²λ¦¬λ¬Έμ΄ μ¬λΌμ§ κ²μ νμΈν΄ λ³Ό μ μλ€. μ΄μ λ°λΌ λ§μ½, CowλΌλ Animal κ°μ²΄λ₯Ό μΆκ°νλ € ν λ, Concrete Productμ Concrete Creator κ°μ²΄λ§ νλμ© λ§λ€μ΄μ£Όλ©΄ μλ μ‘΄μ¬νλ μ½λλ₯Ό μμ νλ μΌμ λ°μνμ§ μλλ€. μ¦, κ°λ°©-νμ μμΉμ μ€μνκ² λλ€.
λ¨μ
μ λ§ λ¬ννκ² λ§νλ€λ©΄, λΆκΈ° μ²λ¦¬λ¬Έμ μ¬μ©νμ§ μμΌλ €κ³ Creatorλ₯Ό μ μν΄ μ£Όκ³ Concrete Creator κ°μ²΄κΉμ§ μμ±ν΄μ€μΌ νκΈ° λλ¬Έμ λ°°λ³΄λ€ λ°°κΌ½μ΄ λ 컀μ§λ κ²½μ°κ° λ°μν μ μλ€.
'CS > λμμΈ ν¨ν΄' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[GoF λμμΈ ν¨ν΄] - μ±κΈν€ ν¨ν΄ (0) | 2024.12.02 |
---|---|
[GoF λμμΈ ν¨ν΄] - νλ‘ν νμ ν¨ν΄ (0) | 2024.11.29 |
[GoF λμμΈ ν¨ν΄] - λΉλ ν¨ν΄ (0) | 2024.11.28 |
[GoF λμμΈ ν¨ν΄] - μΆμ ν©ν 리 λ©μλ ν¨ν΄ (2) | 2024.11.26 |
[GoF λμμΈ ν¨ν΄] - λμμΈ ν¨ν΄μ΄λ? (1) | 2024.11.22 |
λκΈ