[iOS] Singleton Pattern 으로 아메리카노 주문하기

재현·2022년 4월 3일
1
post-thumbnail

"오늘은 얼음 2개, 에스프레소 3샷이 들어간 핫 아메리카노를 카페에서 마셔야겠다"

하나의 메뉴를 주문하는데 다양한 옵션이 있다.
예를 들어, 아메리카노 주문 시 아래와 같이 선택할 수 있다.

  1. 핫 / 아이스
  2. 매장 / 포장
  3. 수량
  4. 샷 개수
  5. 기타 옵션(시럽, 얼음, 물의 양...)

위 선택지는 하나의 페이지(View)에서 선택할 수도 있고, UI, UX 를 위해
여러 페이지에서 선택할 수도 있다. 각각의 View에서 다양한 옵션을 선택한다고
할 때, 기본적으로 "아메리카노" 라는 하나의 메뉴(객체)에 대해서 옵션을
추가(설정)해준다.

이를 싱글톤(Singleton)이라고 한다.

Singleton Pattern 이란?

"전역에서 접근 가능한 단 하나의 객체를 구성하는 Design Pattern"

각각의 ViewController(VC) 에서 새로운 객체(인스턴스)를 생성하는 것이 아닌
한 번의 호출로 생성된 한 개의 인스턴스에 대해서 각 VC 마다 Property 를
설정 또는 참조해서 문제를 해결하는 구조, 디자인 패턴이다.

왜 Singleton Pattern 을 썼을까?

아래 사진과 같이 앱 구조상 하나의 메뉴가 선택될 시 여러 VC 에서
다양한 옵션이 추가될 수 있고 설정된 메뉴를 또 다른 VC 에서
확인할 수 있게 해야하는데 이를 하나의 인스턴스를 통해서
구조를 짜는 것이 효율적인 방안이라고 판단했다.

Code Structure

0. MenuInfo Model

  • 카테고리별 메뉴 정의
  • 각 메뉴의 기본 옵션은 Dictionary 를 활용해 Array 에 추가
  • func setMenuOptionTappedMenuButton(menuName: String) { ... }
    함수로 MenuListView 에서 MenuButton Tapped 시 MenuInfo 인스턴스의 변수(name, price ...)에
    메뉴 연관값 할당
class MenuInfo() {

	// static 키워드로 MenuInfo 인스턴스 상수shared 전역화
	static let shared = MenuInfo()
    
    // private 키워드로 다른 viewController 에서 추가적인 init 방지
    private init() {	}
    ...
  }

1. MenuList

  • 메뉴 버튼클릭시 다음 ViewController 의 변수(Label,Image)에 클릭한 버튼의
    값 전달 후 present SelectOptionViewController

2. Select Option

  • 매장/포장 & 핫/아이스 옵션 중 하나라도 선택이 안 되어있을 시 알람 발생
  • 필수 옵션이 선택되어 있을 시 옵션이 설정된 menuInstance 를 putMenuList 에 append
    (이는 PayViewTable 설정과 연관되어 있으므로 추후 TableView 작성 시 추가 설명 예정)

Singleton 장점

  1. 메모리 효율
  • 각각의 ViewController 마다 최초로 생성된 인스턴스를 활용할 수 있기에
    추가적인 낭비를 방지할 수 있음
  1. 데이터 공유
  • 하나의 인스턴스에 대해 전역적으로 접근하여 이를 set&get 할 수 있음

Singleton 단점

  1. OCP(Open Closed Principle) 개방-폐쇄 원칙을 위배할 수도 있음
  • OCP : "Software Entity(class, module, function 등)이 extension 에는 개방되어있고,
    modification 에는 폐쇄되어있어야함

  • 하나의 인스턴스가 너무 많은 일을 하거나 여러 클래스의 인스턴스와 결합이 되어 이후 유지보수 또는 확장 시 곤란해질 수도 있음

profile
Do Work As We & Respect 🙆🏾 🙆🏻‍♂️ 🙆🏻‍♀️ 🙆‍♀️

0개의 댓글