"오늘은 얼음 2개, 에스프레소 3샷이 들어간 핫 아메리카노를 카페에서 마셔야겠다"
하나의 메뉴를 주문하는데 다양한 옵션이 있다.
예를 들어, 아메리카노 주문 시 아래와 같이 선택할 수 있다.
위 선택지는 하나의 페이지(View)에서 선택할 수도 있고, UI, UX 를 위해
여러 페이지에서 선택할 수도 있다. 각각의 View에서 다양한 옵션을 선택한다고
할 때, 기본적으로 "아메리카노" 라는 하나의 메뉴(객체)에 대해서 옵션을
추가(설정)해준다.
이를 싱글톤(Singleton)이라고 한다.
"전역에서 접근 가능한 단 하나의 객체를 구성하는 Design Pattern"
각각의 ViewController(VC) 에서 새로운 객체(인스턴스)를 생성하는 것이 아닌
한 번의 호출로 생성된 한 개의 인스턴스에 대해서 각 VC 마다 Property 를
설정 또는 참조해서 문제를 해결하는 구조, 디자인 패턴이다.
아래 사진과 같이 앱 구조상 하나의 메뉴가 선택될 시 여러 VC 에서
다양한 옵션이 추가될 수 있고 설정된 메뉴를 또 다른 VC 에서
확인할 수 있게 해야하는데 이를 하나의 인스턴스를 통해서
구조를 짜는 것이 효율적인 방안이라고 판단했다.
class MenuInfo() {
// static 키워드로 MenuInfo 인스턴스 상수shared 전역화
static let shared = MenuInfo()
// private 키워드로 다른 viewController 에서 추가적인 init 방지
private init() { }
...
}
OCP : "Software Entity(class, module, function 등)이 extension 에는 개방되어있고,
modification 에는 폐쇄되어있어야함
하나의 인스턴스가 너무 많은 일을 하거나 여러 클래스의 인스턴스와 결합이 되어 이후 유지보수 또는 확장 시 곤란해질 수도 있음