Creational Design Pattern - Singleton, Prototype, Factory

kyle Kim·2022년 12월 13일
0

iOS개발

목록 보기
17/22

Creational Design Pattern은 Object의 생성에 대해 다루고, 상황에 맞게 적절한 디자인 패턴을 사용할 수 있도록 도와주는 디자인 패턴이다.
여러 패턴이 있는데 iOS 개발에서 좀 유명한 Creational Design Pattern만 다루겠다.

1. Singleton 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

Singleton 장점

  • 메모리에 한 번 올라가기 때문에 메모리 사용 측면에서 봤을때 효율적이라고 할 수 있다.
  • Global이기 때문에 여러 클래스에서 쉽게 사용 가능.

Singleton 단점

  • 한 번만 만들면 되기 때문에 편하게 사용이 가능하지만, SOLID 원칙을 위반할 수 있기 때문에 주의를 해야한다. 인터페이스를 먼저 정의 해놓고 객체를 만들어야하지만 Singleton 패턴은 클래스 인터페이스 없이 클래스의 객체를 만들어 사용하기 때문에 해당 객체에 대한 의존성이 높아지게 된다.
  • 뿐만 아니라, State를 가지는 Singleton 클래스를 만들게 되면, global하게 접근해서 State를 변경시킬 수 있기때문에 위험하다.
  • 수정과 테스트가 어려움.

2. Prototype Pattern

한 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"

Prototype 장점

  • 초기화를 위한 코드를 쓰지 않고 복제할 수 있다.
  • snapshot 개념으로 사용할때 아주 편리하다.
  • 복잡한 Object를 만들기위해 긴 코드를 쓰지 않아도 된다.

Prototype 단점

  • 순환참조가 있는 복잡한 객체는 구현하기 복잡할 수 있다.

3. Factory Method Pattern

한 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()

Factory 장점

  • 같은 protocol을 따르는 새로운 Class를 만들어야할때, 추가해주기가 좋다. 반대로, 지워줘야할때도 유용하다.
  • 수정이 필요할때도 팩토리 메서드만 수정해주면 된다.

Factory 단점

  • factory와 enum 등 여러가지를 만들어줘야하기 때문에 코드량이 증가한다.

결론

Singleton, Prototype, Factory 이렇게 세가지를 알아봤는데 Singleton을 제외하고는 많이 사용해보지 않은거같다. 프로젝트에 적용해보면서 연습을 좀 해봐야겠다. 다른 디자인 패턴도 더 알아보도록 하겠다.

profile
가고일(gagoil)의 개발일지

0개의 댓글