Featured image of post Singleton Pattern

Singleton Pattern

Singleton

Singleton이란?

Singleton = Only one instance Available (한번만 만들어서 쓴다! 정도랄까?)

특정 용도로 객체를 하나만 생성하도록 보장하여 사용하는 디자인 패턴

img GangOfFour의 디자인 패턴에서 이야기하고 있는 여러가지 디자인 패턴 중 생성 - Singleton의 UML 다이어그램이다.

img

애플 문서의 그림을 보면

  • 일반적인 Class는 여러번 호출하여 원하는 갯수만큼의 인스턴스를 얻을 수 있지만,
  • 싱글톤 클래스는 애플리케이션이 요청한 횟수와 상관없이 동일한 인스턴스를 반환한다.
  • 싱글톤 개체는 해당 클래스의 리소스에 대한 전역 액세스 지점을 제공(Global available) ➡️ 단점으로는 유닛 테스트가 어려워질 수 있겠다.

Cocoa framework에서 UIKit의 NSFileManager, NSWorkspace,
UIKit에서 UIApplicationUIAccelerometer가 싱글톤으로 사용된다고 한다.

싱글톤 인스턴스를 반환하는 팩토리 메서드의 이름은 규칙에 따라 Shared + Class Type 형식
➡️ Cocoa 프레임워크의 예 sharedFileManager, sharedColorPanel, sharedWorkspace

🌱 싱글톤 사용 예

1
2
3
4
5
  let UserDefaults = UserDefaults.standard
  let fileManager = FileManager.default
  let urlSession = URLSession.shared
  let application = UIApplication.shared
  let notification = NotificationCenter.default

싱글톤 장/단점

장점 ✅ 한개의 인스턴스만 생성하므로 메모리 낭비를 방지할 수 있음 ✅ Singleton Instance는 전역 Instance로 다른 클래스들과 자원 공유가 쉬움 ✅ 인스턴스가 1개라는 것을 보증받는다 (Thread Safe)
단점 ✅ 인스턴스가 너무 많은 일을 하거나, 많은 데이터를 공유하면 Instance들 간 결합도가 높아져 개방-폐쇄 원칙(OCP, Open-Closed Principle)을 위배할 수 있음(의존성을 만들어 낸다) ➡️ Unit 테스트가 어려워 질 수 있음

Shared Class Type

static을 사용하여 싱글톤을 생성할 수 있다

1
2
3
  class Singleton {
  	 static let shared = Singleton()
  }

초기화 이외의 추가 설정을 해야 하는 경우, 클로저 호출 결과를 전역 상수에 할당할 수 있다.

1
2
3
4
5
6
7
class Singleton {
    static let shared: Singleton = {
        let instance = Singleton()
        // setup code
        return instance
    }()
}

ochococo 깃허브에 올라와 있는 swift 싱글톤 예제

1
2
3
4
5
6
7
8
9
final class ElonMusk {

    static let shared = ElonMusk()

    private init() {}
        // Private initialization to ensure just one instance is created.
}

let elon = ElonMusk.shared // There is only one Elon Musk folks.

Reference

Apple - Singleton
Managing a Shared Resource Using a Singleton
Learn iOS Singletons
Design-Patterns-In-Swift - Singleton
소들이 블로그 - 싱글톤 패턴