서론
저번 포스팅에서는 팩토리 메서드 패턴에 대해 알아보았습니다.
이번 포스팅에서는 Abstract Factory 패턴에 대해 알아보겠습니다.
연관된 내용이 많으므로 지난 포스팅을 보고 와주세요.
Abstract Factory 패턴
추상 팩토리 패턴은 구체적인 클래스에 의존하지 않고
서로 연관된 객체 조합을 만드는 인터페이스를 제공하는 패턴입니다.
지난 포스팅에서 다룬 팩토리 메서드 패턴에서는
PlayerFactory 클래스를 이용해 MusicPlayer, VideoPlayer를 생성했습니다.
만약 다른 성격의 Product가 추가된다면 새로운 팩토리가 생성될 것이고, 각 팩토리들은 서로 독립적입니다.
추상 팩토리 패턴에서는 이 팩토리를 한 번 더 감싸서 하나의 팩토리에서 여러 Product 조합을 생성할 수 있습니다.
이를 통해 코드를 변경하지 않아도 조건에 맞는 적절한 객체를 사용할 수 있게 됩니다.
또한 그 관리를 한 곳에서 가능해서 유지보수가 용이하게 됩니다.
예시
음악가를 추상 팩토리 패턴으로 구현해보겠습니다.
Music Product는 음악 종류(클래식, 밴드 등)를 나타내고, Instrument Product는 악기 종류를 나타냅니다.
Music Product부터 알아봅시다.
//Product
protocol Music {
var name: String { get set }
}
//Concrete Product
struct Classic: Music {
var name: String
}
struct Band: Music {
var name: String
}
클래식과 밴드 음악을 표현하고 있습니다.
다음은 악기를 표현하는 Insttrument입니다.
//Product
protocol Instrument {
func play()
}
//Concrete Product
struct Violin: Instrument {
func play() {
print("Play Violin")
}
}
struct Guitar: Instrument {
func play() {
print("Play Guitar")
}
}
바이올린과 기타를 표현하고 있습니다.
이제 Music과 Instrument Product를 생성하는 하나의 팩토리를 정의합니다.
protocol MusicianFactory {
func createMusic(name: String, type: MusicType) -> Music
func createInstrument() -> Instrument
}
이제 음악가 팩토리는 반드시 위 프로토콜을 준수해야 합니다.
struct ViolinistFactory: MusicianFactory {
func createMusic(name: String) -> Music {
return Classic(name: name)
}
func createInstrument() -> Instrument {
return Violin()
}
}
struct GuitaristFactory: MusicianFactory {
func createMusic(name: String) -> Music {
return Band(name: name)
}
func createInstrument() -> Instrument {
return Guitar()
}
}
바이올리니스트와 기타리스트 팩토리는 각자 조건에 맞는 Product를 생성하고 있습니다.
만약 조건이 달라진다면 이 팩토리에서만 변경해주면 되기 때문에
따로 관리를 할 때보다 유지보수에 용이합니다.
감사합니다.
참고