Design Pattern
[Swift] 디자인패턴 | 추상 팩토리 패턴(Abstract Factory Method)
iOSDEv
2024. 2. 5. 13:24
생성패턴이란?
객체의 생성에 관련된 패턴으로 객체의 생성절차를 추상화하는 패턴
객체를 생성 합성하는 방법이나객체의 표현방법과 시스템을 분리
객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않아서 유연성을 제공하게된다
추상 팩토리 패턴
이것 또한 예전 게임개발을 하던 중 사용해봤던 패턴중 하나였다
스토리 게임을 진행하는 일부 기능을 개발하던 중에 사용했었다
유저가 어떤 사용자를 선택해서 이야기를 진행하는 기능인데
유저의 어떤 선택에 따라서 자동으로 하나의 종류의 고양이그게 아니라면 강아지가 생성되어야 한다고 하면
cat을 선택하면 고양이가 종류별로 생성되고 강아지를 선택하면 강아지가 종류별로 생성된다
Swift에서는 어떻게 사용되어질까?
예를 들어
기존 Button을 만들어주는 Factory, Label을 만들어주는 Factory가 있다고 가정하고
ipad/iphone의 전용 ui가 필요하면 각각 기기에 맞는 Button, Label이 필요하게 된다
(동일시 할 수 없다고 가정)
이 때 Button, Label Factory를 한 번 더 추상화 하여 iPhone, iPad Factory를 만든다면 각각의 부품에 대한 Factory를 가지는 것이 아니라 iPhone, iPad Factory를 가지면 한 번에 해결됨
그리고
또 다른 예를 들 수 있다
가구 판매장을 위한 프로그램을 만들고 있는데
베스트 제품 패밀리 : 의자 + 소파 + 커피테이블
세일 제품 패밀리 : 의자 + 소파 + 커피테이블 (여기서 현대식 / 빅토리안 / 아르데코 양식) 타입으로 제공


언제 보통 사용될까?
- 생성을 책임지는 구체적인 클래스를 분리시키고 싶을 때
- 추상 팩토리 패턴은 인스턴스를 생성하는 과정을 캡슐화 한 것 그래서 생성에 관한 구체적인 내용이 사용자와 분리됨
- 여러 제품군중 선택을 통하여 시스템을 구성하고 제품군을 대체하고 싶을 때 사용합니다
- 구체 팩토리를 추가하거나 변경을 통해 서로 다른 제품을 사용할 수 있게 할 수 있습니다
- 추상 팩토리는 필요한 모든것을 생성하기 때문에 저체 제품군을 한 번에 변경이 가능하다
Factory Method vs Abstract Factory Method
- ⭐️팩토리 메서드 패턴
- 팩토리가 되는 클래스가 하나의 객체를 생성하고 리턴하는게 전부
- ⭐️추상 팩토리 패턴
- 관련있는 여러 종류의 객체를 특정 그룹으로 묶어버려(다형성) 한 번에 생성
장점
- ⭐️ 관리의 용이성
- 클래스 이름 대신에 팩토리 메서드를 사용해 객체를 생성하기 때문에 추후 실제 생성되는 객체가 바뀌거나 추가되어도 소스의 수정이 거의 없고 문제가 없음(생성 부분의 수정과 신규 클래스 추가정도임)
- ⭐️보안성
- 클래스의 대부분의 내용은 숨기고 싶을 때 인터페이스(protocol)이나 추상화를 통해서만 객체에 접근이 가능하다
- ⭐️리소스 재활용
- 반드시 객체를 새로 생성할 필요는 없고 상황에 따라 새로 생성될 수도 기존의 것을 리턴할 수 있다
- ⭐️상속 구조⭐️(only 추상 팩토리 장점)
- 세밀한 팩토리 관리가 가능
단점
- ❌ 패턴과 함께 새로운 프로토콜과 클래스들이 많이 사용되기 때문에 코드가 필요 이상으로 복잡해질 수 있다
예시
예시 1




예시 2

- 생성을 담당하는 Factory 구현

- 생성될 Product 구현

- 사용 부분

예시 3 (chat gpt)
// 추상 제품 프로토콜
protocol Character {
func attack() -> String
}
protocol Weapon {
func damage() -> Int
}
// 구체적인 제품 클래스들
class Warrior: Character {
func attack() -> String {
return "Warrior attacks!"
}
}
class Mage: Character {
func attack() -> String {
return "Mage attacks with magic!"
}
}
class Sword: Weapon {
func damage() -> Int {
return 10
}
}
class Wand: Weapon {
func damage() -> Int {
return 5
}
}
// 추상 팩토리 프로토콜
protocol GameFactory {
func createCharacter() -> Character
func createWeapon() -> Weapon
}
// 구체적인 팩토리 클래스들
class WarriorFactory: GameFactory {
func createCharacter() -> Character {
return Warrior()
}
func createWeapon() -> Weapon {
return Sword()
}
}
class MageFactory: GameFactory {
func createCharacter() -> Character {
return Mage()
}
func createWeapon() -> Weapon {
return Wand()
}
}
// 클라이언트 코드
class Game {
var character: Character
var weapon: Weapon
init(factory: GameFactory) {
character = factory.createCharacter()
weapon = factory.createWeapon()
}
func startGame() {
print("Game starts!")
print(character.attack())
print("Weapon damage: \(weapon.damage())")
}
}
// 예제 사용
let warriorGameFactory = WarriorFactory()
let warriorGame = Game(factory: warriorGameFactory)
warriorGame.startGame()
let mageGameFactory = MageFactory()
let mageGame = Game(factory: mageGameFactory)
mageGame.startGame()
참고
https://refactoring.guru/ko/design-patterns/abstract-factory
추상 팩토리 패턴
/ 디자인 패턴들 / 생성 패턴 추상 팩토리 패턴 다음 이름으로도 불립니다: Abstract Factory 의도 추상 팩토리는 관련 객체들의 구상 클래스들을 지정하지 않고도 관련 객체들의 모음을 생성할 수 있
refactoring.guru
Design Pattern in Swift - 야곰닷넷
Design Pattern in Swift 디자인 패턴 코스에 오신 것을 환영합니다! 이 코스는 야곰 아카데미 3기 수료생들과 […]
yagom.net