[CS지식] 1-1. 디자인 패턴 - 팩토리 패턴(Factory Pattern) & 전략 패턴(Strategy Pattern)

김zunyange·2023년 5월 15일
0

CS Note

목록 보기
2/13
post-thumbnail

1-1-1. Singleton Pattern 과 디자인 패턴에 대해 👈🏻

1-1-2. Factory Pattern

팩토리 패턴이란?
객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴
: 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴

(1) 팩토리 패턴이 생기게 된 이유

객체 지향 디자인 패턴의 기본 원칙은 확장에 있어서는 열려 있어야 하며, 수정에 있어서는 닫혀 있어야 한다는 것이다. (OCP, Open Closed Principle)

여기서 수정에 있어서 닫혀 있어야 한다는 말에 주목해보자. 코드를 수정하지 않아도 모듈의 기능을 확장하거나 변경 할 수 있어야 한다. 때문에, 수정이 일어날 가능성이 큰 부분과 그렇지 않은 부분을 분리하는 것이 좋다.

객체는 속성과 함수가 변경, 또는 추가 될 수 있다. 이에 따라 객체의 생성을 담당하는 코드는 변경의 가능성이 높다. 객체의 생성을 담당하는 클래스를 한 곳에서 관리하여 결합도를 줄이기 위하여 팩토리 패턴이 나타나게 된 것이다.

(2) 자바스크립트의 팩토리 패턴

new Object() 로 구현

const num = new Object(42)
const str = new Object('abc')
num.constructor.name; // Number
str.constructor.name; // String

숫자를 전달하거나 문자열을 전달함에 따라 다른 타입의 객체를 생성하는 것을 볼 수 있다. 즉, 전달받은 값에 따라 다른 객체를 생성하며 인스턴스의 타입 등을 정한다.

(3) 장점

  • 상위 클래스와 하위 클래스가 분리되기 때문에 느슨한 결합을 가지며, 상위 클래스에서는 인스턴스 생성 방식에 대해 알 필요가 없기 때문에 더 많은 유연성을 가짐
  • 객체 생성 로직에 따로 떼어지는 느슨한 결합 상태가 되고 코드를 리팩토링하더라도 한 곳만 고칠 수 있으므로 유지 보수성이 증가
  • 수정이 일어날 부분과 그렇지 않을 부분을 분리함

(4) 단점

  • 패턴을 구현할 많은 서브 클래스를 도입해야하므로 코드가 복잡해진다.

(5) 그래서 왜 팩토리 패턴을 쓴다고?!

객체 생성 하는 코드를 분리하여 클라이언트 코드와 결합도(의존성)를 낮추어 코드를 건드리는 횟수를 최소화 하기 위해!
왜 코드를 건드리는 횟수가 최소화 될까?!
객체를 생성하는 코드 부분을 분리 시켰기 때문에 객체를 추가/수정이 일어나더라도 객체를 생성하는 코드만 건들면 돼서!


1-1-3. Strategy Pattern

전략 패턴이란?
정책 패턴(policy pattern)이라고도 하며, 객체의 행위를 바꾸고 싶은 경우 ‘직접’ 수정하지 않고 전략이라고 부르는 ‘캡슐화한 알고리즘’을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴

  • 같은 문제를 해결하는 다양한 알고리즘을 캡슐화해서 필요할 때 꺼내 쓰는 패턴으로 행위를 유연하게 확장한다.
  • 팩토리 패턴과 전략 패턴이 얼핏 비슷하게 생각될 수 있는데, 팩토리 패턴은 객체 생성에 관여하는 것이고, 전략 패턴은 프로세스 진행에 관여한다.
  • 예제 : 아래 사진 같은 검색 화면을 만든다고 가정하자.

4개의 버튼들 중 하나를 눌러서 모드를 설정하고 선택된 모드에 따라서, 검색 버튼을 눌렀을 때 실행되는 검색의 방식이 결정되도록 해야 한다. 즉, 프로그램 실행 중 모드가 바뀔 때마다 검색이 이뤄지는 방식 = 전략이 수정되는 것이다.

그런데 패턴을 사용하지 않고 코드를 짠다면, 버튼들이 눌릴때마다 다른 onClick 메소드가 if문으로 적용되고, 각각에 수정사항이 생기거나 새로운 기능이 추가되면 onClick 메소드를 그때그때 다시 수정해줘야 한다.
소프트웨어가 커지고 복잡해질수록 코드를 분석하고 관리하기 어려워지고 클래스마다 역할지정을 뚜렷히해서 모듈화된 소프트웨어를 구축해나가는 객체지향의 철학에도 어긋난다.
따라서, 전략 패턴을 사용하여 모드마다의 동작 하나하나를 모듈로 따로 분리해서, 버튼들을(4개의 버튼) 누를때마다 검색 버튼을 누를때 실행될 검색 모듈을 갈아끼워주는 방식으로 코드를 짜는 것이 좋다.

즉, "옵션들마다의 행동들을 모듈화해서 독립적이고 상호 교체 가능하게 만드는 것"이 Strategy Pattern 이다.

(1) 장점

  • 확장성이 좋다 : 코드를 직접 수정하지 않고 새로운 코드를 추가해서 확장이 가능하다
  • 런타임 시 전략을 변경할 수 있다.

(2) 단점

  • 애플리케이션에 들어가는 모든 전략을 알고 있어야 한다.
  • 어떤 상황에 어떤 전략이 사용되어야 하는지 알아야 하기 때문이다.
  • 전략을 추상화하는 인터페이스가 효율적이지 못할 수 있다.

📍 출처
주홍철, [면접을 위한 CS 전공지식 노트]
얄팍한 코딩사전, "객체지향 디자인패턴 1"

📍 참고하면 좋을 사이트
https://velog.io/@ellyheetov/Factory-Pattern (더 구체적인 팩토리 패턴 설명)

profile
배움은 즐거워 ~(*ૂ❛ᴗ❛*ૂ)

0개의 댓글