객체지향 디자인패턴 1

핫다리·2023년 3월 12일

CS

목록 보기
16/46

movie

Singleton(싱글톤) 패턴

  • 어떤 클래스의 객체가 프로세스 내에서 단 한 개만 만들어져야할 때 사용

예: Setting을 관리하는 클래스 (다크모드를 설정하면, 모든 페이지에 다크모드가 적용되어야 함)

어떻게?
생성자를 private으로 변경 -> 다른 클래스에서 new로 생성할 수 없게 된다
클래스 안에 자신의 타입을 갖는 객체를 선언

static 아닌 변수는 객체가 생성될 때마다 동적공간에 메모리가 할당되지만, static 변수는 메모리가 지정된 정적 공간에 딱 하나만 존재한다 -> 객체를 new로 생성하지 않아도 바로 불러 사용할 수 있다

그냥 정적 변수를 쓰지 왜 싱글톤을 쓸까?
인터페이스의 사용이나 lazy loading 등 싱글톤으로 할수 있는 것들이 더 많기 때문에

Strategy(전략) 패턴

  • 프로그램 실행 중 선택된 모드에 따라 실행되는 방식, 즉 전략이 결정될 때 사용

예: 전체, 이미지, 뉴스, 지도 선택/검색 클릭 -> 검색할 때 선택한 검색 모드에 따라 각각 다른 검색 방식이 실행

어떻게?

  • 위 예시를 전략패턴을 적용하지 않고 구현한다면?
    Button을 눌렀을 때 onClick함수에서 조건문을 사용해, 검색 모드에 따라 동작을 다르게 실행한다. 수정사항이 생기거나 모드가 추가되면 onClick은 한없이 길어짐

  • 전략패턴을 사용하면?
    모드마다의 동작 하나하나를 모듈로 따로 분리하여 검색버튼을 누를 때 실행될 검색 모듈을 갈아끼워주는 방식 사용

SearchStrategy 인터페이스를 만들고 onClick에서 searchStrategy의 search() 함수만 호출한다. setter를 이용해 searchStrategy 를 SearchStategy 인터페이스를 상속 받은 다른 검색 전략으로 갈아끼울 수 있다.

State 패턴

State 패턴의 설계 구조는 strategy와 얼핏 비슷함

차이점
Strategy 패턴: 어떤 동일한 틀 안에 있는 특정 작업의 방식, 모드를 바꿔줄 떄
State 패턴: 특정 상태마다 다르게 할 일을 하나하나 모듈화해서 지정해 둘 때 쓰임
예: TV 전원 On/Off 스위치

Strategy 패턴이, 지정된 특정 메소드가 모듈화된 모드에 따라 다르게 실행되도록 하는 거라면 State 패턴은 메소드가 실행될 때 그 모드도 전환 된다

Command 패턴

전략 패턴은 같은 일을 하되 (ex) 검색), 알고리즘이나 방식이 갈아끼워짐

커맨드 패턴은 그 하는 일 자체가 다른 것!

-> 작성하는 방식이 다양함

Adapter 패턴

형식이 다른 둘 사이를 연결 -> 이 둘이 호환될 수 있게 해줌

객체 지향에서는 어답터는 보통 인터페이스가 서로 다른 객체들이 같은 형식 아래 작동할 수 있도록 하는 역할

예: Strategy 패턴 예제 처럼 SearchButton 모드에 동영상 모드가 추가되었는데, 완전 다른 구조의 다른 라이브러리 코드라면? (다른 전략들 처럼 단순히 search()하는 것이아니라, FindAlgorithm에서 find(true)로 호출해야함)

-> SearchFindAdapter라는 클래스를 지정하고 FindAlgorithm 객체를 생성자로 넘겨줌, 어댑터 안의 search 메소드를 실행하면 find 메소드가 실행되도록 한다

Proxy 패턴 (대리인 패턴)

프로그래밍에서 사용하는 일 중 중대한 일들은 객체로 여럿 생성해서 사용하기 부담이 될 수 있다. 이 때, 클래스의 Proxy를 만들어 비서 같은 이 클래스가 가벼운 역할들을 하도록 만들고, 중요한 일이 있을 때만 실제 클래스를 만들어 무거운 일을 돌린다.

어떻게?
예: 유튜브 영상 목록에서 썸네일에 마우스 오버시 프리뷰가 재생되는 기능

이런 가벼운 작업은 ProxyThumbnail 클래스에서 하게 하고 ProxyThumbnail에서 showPreviw함수를 호출할 때 그제서야 RealThumbnail 객체를 생성하여 무거운 작업을 진행한다.

profile
일단 만들고 본다

0개의 댓글