디자인 패턴 : 싱글톤 패턴, 전략패턴, 프록시 패턴
1. 싱글톤 패턴
-> 어떤 클래스의 객체가 해당 프로세스에서 딱 하나만 만들어져 있어야 할 때
-> ex) 사용자가 앱을 사용하는데 세팅에서 다크 모드를 설정해 놓으면 다른 페이지로 이동하더라도 다크 모드가 유지되어 있어야 함
즉, 어떤 페이지에 있든 세팅을 관리하는 객체는 반드시 같은 것을 사용해야 한다는 것
-> 생성자를 private으로 선언해 생성하지 못하도록 한다.
-> static으로 클래스 자기 자신인 Settings 타입의 객체를 하나 만들어 놓음
-> 즉 클래스 안의 static이 아닌 변수나 메소드들은 객체가 생성될 때마다 메모리의 공간을 새로 차지함
-> static으로 선언된 것들은 객체가 얼마나 만들어지든 메모리의 지정된 공간에 딱 하나씩만 존재하게 됨
-> 컴파일 할때부터 이 요소가 차지할 메모리 용량을 이미 알 수 있도록 딱 정해져 있음
-> 즉 위의 코드를 보면 Settings 타입으로 선언된 객체 settings은 같은 인스턴스를 바라본다.
2. Strategy Pattern
전략 패턴: 옵션들마다의 행동들을 모듈화 해서, 독립적이고 상호 교체 가능하게 만드는 것
ex)
-> 위의 버튼에 따라 선택된 모드에 따라서 검색 버튼을 눌렀을 때 실행되는 검색의 방식이 결정되도록 하는 것
-> 프로그램 실행 중 모드가 바뀔 때 마다 검색이 이뤄지는 방식, 전략이 수정된다는 것
-> mode에 따라 setModeAll이나 setModeImage 등 버튼에 맞게 mode값이 세팅되고, 버튼이 눌리면 onClick메서드를 실행해,
각 버튼 상태에 맞는 코드들이 실행됨
-> 해당코드의 단점은 SearchButton의 onClick메서드를 버튼의 변경사항이 생길 때마다 수정해줘야 함
-> 만약 버튼이 추가된다면 해당 메소드에 else if문을 통해 추가...
-> 안좋은 코드
🤔왜 안좋은 코드냐?
-> 일단 객체지향에 어긋난 코드
-> 캡슐화가 안 된 느낌...
-> 그리고 if else 문의 반복이 좋지 못한 코드... (단지 내 생각)
-> searchStrategy의 타입에 따라 search메서드 실행이 달라진다.
-> 왜 좋냐? 각 버튼에 대한 변경사항이 생긴다면 해당 클래스에서 수정하면 된다.
-> 즉 변경점을 찾기 쉽고... 객체지향적으로 설계된 코드라 할 수 있다.
3. Proxy pattern
ex)
-> 인터넷에서 받아와야 해서 시간이 소요되거나, 메모리를 많이 차지하거나 하는 등의 이유로 객체로 여러 개 생성하기 부담되는 것들이 존재
-> 이럴 때 해당 클래스의 'Proxy' 즉 대리자 역할을 하는 대리인 역할을 하는 클래스를 따로 두어 가벼운 일은 프록시 객체가 처리
-> 무거운 작업을 할 때 실제 클래스를 생성해 사용
ex) 유튜브처럼 썸네일을 보고 해당 썸네일 위로 마우스를 가져가면 해당 영상의 프리뷰가 뜸
비슷한 형식으로 제목을 처음 화면에 나타내고, 제목이 있는 화면에 마우스를 올리면 프리뷰 영상이 재생되는 사이트를 만든다면
제목을 화면에 나타내는 건 '가벼운 작업' 프리뷰를 보여주려면 영상 데이터를 받아와야 함
즉, 썸네일을 담당하는 객체는 제목과 프리뷰를 두 메서드를 통해 각각 보여주도록 한다.
썸네일을 처음 보여줄 때는 제목만 나타내는 프록시 클래스로 작업을 하고 프리뷰를 보여주는 무거운 작업은 실제 클래스가 담당하도록
-> 위의 사진에서 오른쪽 코드를 보면 RealThumbnail 클래스와 ProxyThumbnail 클래스가 있는 것을 볼 수 있다.
-> 두 클래스는 모두 Thumbnail 인터페이스를 적용함
-> RealThumbnail클래스는 생성 과정에서 영상을 다운로드하는 무거운 작업을 실행한다.
-> 실제 영상을 갖고 있기 때문에 제목을 보여주는 showTitle와 영상을 재생 하는 showPreview 모두 가능
-> proxyThumbnail 클래스를 보면 영상을 받아오는 시간이 필요하지 않고, 객체도 가볍다.
-> 제목을 보여주는 showTitle메서드는 직접 실행할 수 있지만, 프리뷰 영상을 재생하는 메서드인 showTitle는 해당 메소드 실행 시 실제 RealThumbnail 객체를 생성해 실행하는 것을 볼 수 있다.
📖 Reference
https://www.youtube.com/watch?v=lJES5TQTTWE (해당 영상에서 설명하는 모든 디자인 패턴을 정리하지 x )