Singleton

스크린샷 2022-10-17 오후 1.06.47.png

Singleton은 클래스에 인스턴스가 하나만 있는지 확인하는 동시에 이 인스턴스에 대한 전역 접근 지점을 제공하는 생성 디자인 패턴이다.

Problem

Singleton 패턴은 단일 책임 원칙을 위반하여 두 가지 문제를 동시에 해결한다.

  1. 클래스에 인스턴스가 하나만 있는지 확인한다. 왜 누군가가 클래스에 있는 instance 수를 제한하고 싶어 할까? → 일부 공유 리소스(예: 데이터 베이스 또는 파일)에 대한 접근을 제어하기 위한 것이다.

작동 방식

객체를 생성했지만 새 객체를 받는 대신 이미 만든 객체를 받게 된다.

생성자 호출은 항상 새 객체를 반환 해야하므로 이 동작은 일반 생성자로 구현할 수 없다.

  1. 해당 인스턴스에 대한 전역 접근 지점을 제공한다. 일부 필수 객체를 저장하는 데 사용했던 전역 변수를 만들어서 사용한다. 매우 편리하지만 모든 코드가 잠재적으로 해당 변수의 내용을 덮어쓸 수 있고 앱이 충돌할 가능성이 존재해 안전하지 않다.

전역 변수와 마찬가지로 Singleton 패턴을 사용하면 프로그램의 어느 곳에서나 일부 객체에 접근할 수 있다. 다른 코드가 해당 인스턴스를 덮어쓰지 않도록 보호해야 한다.

Singleton의 구현

코드가 Singleton 클래스에 접근할 수 있는 경우 Singleton의 정적 메서드를 호출할 수 있다. 따라서 해당 메서드를 호출할 때마다 항상 동일한 인스턴스가 반환된다.

class SampleSingletonClass {
	public static let shared = SampleSingletonClass()

	private init() { }

	public func save() {
		// ....
	}
}

Applicability