Creational Design Pattern은 Object의 생성에 대해 다루고, 상황에 맞게 적절한 디자인 패턴을 사용할 수 있도록 도와주는 디자인 패턴이다.
여러 패턴이 있는데 iOS 개발에서 좀 유명한 Creational Design Pattern만 다루겠다.
Object를 하나만 생성해서 필요한 부분에서 이 Object를 global하게 불러와서 사용할 수 있게 해주는 Design Pattern이다.
class SingletonClass {
static let shared = SingletonClass()
private init() { } // 또 생성되는 것을 방지하기 위해 private 사용
var text = "text"
func a() { }
}
// 사용 예시
let singletonClass = SingletonClass.shared
let text = singletonClass.text // property
singletonClass.a() //function
한 Object를 Cloning해서 기준이 되는 Obejct와 같은 Object를 만들때 사용하는 Design Pattern이다.
class Prototype {
var text: String
var number: Int
init(text: String = "Text", number: Int = 0) {
self.text = text
self.number = number
}
func clone() -> Prototype {
return Prototype(text: self.text, number: self.number)
}
}
// 사용 예시
// 기준이 되는 object
let prototype = Prototype()
// clone된 첫번째 object
let firstClone = prototype.clone()
firstClone.text = "first"
firstClone.number = "1"
// clone된 두번째 object
let firstClone = prototype.clone()
firstClone.text = "second"
firstClone.number = "2"
한 Object를 만들때 인터페이스를 사용해서 만드는데, 이때 서브클래스를 사용하여 원하는 Object를 골라서 만드는 방법이 Factory Design Pattern이다.
protocol Player {
func play()
func stop()
}
class MusicPlayer: Player {
func play() {
// Code for playing Music
}
func stop() {
// Code for stoping Music
}
}
class VideoPlayer: Player {
func play() {
// Code for playing Video
}
func stop() {
// Code for stoping Video
}
}
enum PlayerType {
case musicPlayer, videoPlayer
}
class PlayerFactory {
static func getPlayer(type: PlayerType) -> Player {
switch type {
case .musicPlayer:
return MusicPlayer()
case .videoPlayer:
return VideoPlayer()
}
}
}
// 사용 예시
// musicPlayer 생성
let musicPlayer = PlayerFactory.getPlayer(type: .musicPlayer)
musicPlayer.play()
musicPlayer.stop()
// videoPlayer 생성
let videoPlayer = PlayerFactory.getPlayer(type: .videoPlayer)
videoPlayer.play()
videoPlayer.stop()
Singleton, Prototype, Factory 이렇게 세가지를 알아봤는데 Singleton을 제외하고는 많이 사용해보지 않은거같다. 프로젝트에 적용해보면서 연습을 좀 해봐야겠다. 다른 디자인 패턴도 더 알아보도록 하겠다.