Typescript 와 생성 패턴 간단 정리

박성룡 ( Andrew park )
3 min readJul 21, 2019

--

GoF의 디자인 패턴 중 생성 패턴을 읽고 이를 Typescript 로 정리해보려고 한다.

Javascript 로도 디자인 패턴을 구현할 수 있지만, 개인적으로 가독성이 Typescript 가 훌륭하기 때문에 선택하였다.

생성 패턴에 관하여

프로그램이 커져 갈 수록 객체를 생성하고 참조하는 영역이 늘어만 간다.

새 기능이 추가되고, 그에 따른 새로운 객체가 늘어날수록 변경이 어려워지고 재사용이 어려워져만 간다.

객체를 생성하거나, 합성하는 방법을 애플리케이션 코드와 분리하게되면, 누가, 언제, 어디서, 무엇을 어떻게 왜 변경하든지 상관 없어지는, 유연성을 확보할 수 있다.

커피를 만드는 시스템을 만들어보자.

아래와 같은 코드로 만들어 볼 수 있다.

이 함수를 컵에 물과 에스프레소를 추가해서 커피를 만들 수 있다.

만약 다른 커피를 만들고 싶다면 다른 이름의 커피만들기 함수를 작성해서, 이 과정을 반복해서 작성해야 한다.

이를 아래 패턴으로 만들어보자.

  1. 추상 팩토리 Abstract Factory
  2. 빌더 패턴 Builder
  3. 팩토리 메서드 Factory Method
  4. 단일체 패턴 Singleton

추상 팩토리 패턴 Abstract Factory

추상 팩토리는 여러 객체가 하나의 클래스 내에서 선언될 수 있도록 도와준다.

이제 CoffeeFactory 로 생성을 하므로, CoffeeFactory를 상속받은 다른 객체를 전달한다면, 다른 커피 생성도 가능하다.

동일한 커피만들기 메서드로 따뜻한 커피를 만들 수 있다.

빌더 패턴 Builder

복잡한 객체를 생성하는 방법과 표현하는 방법을 정의하는 클래스를 별도로 분리하여, 서로 다른 표현이라도 이를 생성할 수 있는 동일한 절차를 제공할 수 있도록 한다.

커피만들기 메서드는 CoffeeBuilder 를 받을 수 있다. CoffeeBuilder 는 메서드로 내부동작을 설명하지는 않는다.

ColdCoffeeBuilder 는 CoffeeBuilder 를 구현하는데, buildCup 로 컵을 만들고, buildWater 로 찬물을 만들어 컵에 추가하고, buildEspresso 로 콩을 커피머신으로 에스프레소를 만들어 컵에 추가하고, getCoffee 으로 컵을 반환한다.

커피만들기 메서드안에 만들어지는 과정을 메서드 안에 간략하게 설명하여, 이해를 돕고, 실제 만들어지는 과정을 Builder 안으로 숨겨, 생성과 표현을 분리 시킬 수 있다.

팩토리 메서드 패턴 Factory Method

객체를 생성하기 위해 인터페이스를 정의한다.

하지만 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브 클래스가 내리도록 한다.

CoffeeMaker 클래스를 만들지만 어떤 커피를 만들지는, 서브 클래스인 CappuccinoCoffeeMaker 가 결정하게 하였다.

만약 CoffeeMaker 클래스를 직접 사용하게되면, CoffeeMaker 변경에 따라 CappuccinoCoffeeMaker 영향이 받게된다. 그러므로 서브 클래스에 위임하여, 의존도를 낮추는것이 중요하다.

단일체 Singleton

싱글톤 패턴은 오직 하나의 클래스 인스턴스만을 갖도록 보장하고, 이에 대한 전역적인 접근점을 제공한다.

CoffeeMakerFactory 는 CoffeeMaker 를 생성할 수 있다.

어디서든지 CoffeeMakerFactory.Instance 으로 동일한 커피 메이커를 가지고 올 수 있다.

정리

디자인 패턴 중 생성 패턴을 간단하게 정리해 보았다.

생성하는 방법을 캡슐화 하여, 각 클래스들의 어떻게 만들어지고 서로 이어지는지를 숨긴다.

의존성을 줄이고 재사용성을 늘리는것이 생성 패턴의 핵심이라고 생각한다.

하지만 각 패턴들이 클래스의 문제를 반드시 해결해 주지 않는다.

어떤 상황에서 어떤 패턴이 유요할지를 더 많이 연습해 보아야 할 것 같다.

--

--

박성룡 ( Andrew park )
박성룡 ( Andrew park )

Written by 박성룡 ( Andrew park )

Javascript is great We may not be great

No responses yet