디자인 패턴 활용 연습
여러 디자인 패턴을 알고 사용해보자.
디자인 패턴
디자인 패턴은 소프트웨어 설계에서 자주 발생하는 문제를 해결하기 위한 솔루션이다.
코드의 가독성, 유지 보수성, 확장성을 향상 시키는데 도움을 준다.
디자인 패턴은 세가지 주요 유형으로 나눌 수 있다.
생성 패턴
객체 생성에 관련된 문제를 해결하는 패턴이다.
- 싱글톤(Singleton) : 특정 클래스의 인스턴스를 오직 하나만 생성하고 해당 인스턴스에 접근 할 수 있도록 하는 패턴
- 팩토리 메서드(Factory Method) : 객체 생성을 서브 클래스에서 처리하고록 위임하는 패턴
- 추상 팩토리(Abstract Factory) : 관련된 객체들을 생성하는 인터페이스를 제공하는 패턴
- 빌더(Builder) : 복잡한 객체의 생성을 단계별로 수행하여 객체를 만드는 패턴
- 프로토타입(Prototype) : 기존 객체를 복제하여 새로운 객체를 생성하는 패턴
구조 패턴
클래스와 객체를 조직화하고 구조를 형성하는데 사용되는 패턴
- 어댑터(Adapter) : 서로 다른 인터페이스를 가진 클래스를 호환되게 만들어주는 패턴
- 데코레이터(Decorator) : 객체에 동적으로 새로운 기능을 추가하는 패턴
- 프록시(Proxy) : 실제 객체에 대한 접근을 제어하는 대리 객체를 제공하는 패턴
- 컴포지트(Composite) : 객체들을 트리 구조로 구정하여 부분-전체 계층을 나타내는 패턴
- 브리지(Bridge) : 추상화와 구현을 분리하여 독립적으로 변경할 수 있게 하는 패턴
행위 패턴
객체나 클래스 간의 상호작용을 정의하고, 협력 방법을 규정하는 패턴
- 옵저버(Observer) : 객체의 상태 변화를 다른 객체에 자동으로 통지하는 패턴
- 전략(Strategy) : 알고리즘을 독립적으로 정의하고, 동적으로 교체할 수 있는 패턴
- 커맨드(Command) : 실행될 작업을 객체로 캡슐화하여 재사용 가능하게 하는 패턴
- 책임 연쇄(Chain of Responsibility) : 요청을 처리할 객체를 여러 객체 중에서 선택할 수 있게 하는 패턴
- 미디에이터(Mediator) : 객체 간 통신을 중앙에서 조정하여 상호 의존성을 줄이는 패턴
위의 여러 디자인 패턴 중 몇 개만 사용해보자.
예제를 통해 확인해보자.
- eomcs-java-lang / com.eomcs.design_pattern / test01에 순서대로 정리되어있다.
팩토리 메서드(Factory Method)
생성자를 private로 만들어 외부에서 사용할 수 없게 제어한다.
그 후 생성을 create에게 맡겨 동일한 특성을 가지고 있는 객체를 유저가 정보 입력없이 간단하게 만들 수 있게 한다.
추상 팩토리(Abstract Factory)
Car 객체를 만드는 일을 따로 분리시켜 추상 클래스로 만든 뒤 이를 상속받아 각 특성을 가진 Car를 만드는 Factory를 만든다. 이때 추상 메서드만 가진 추상 클래스는 인터페이스로 변경 가능하다.
싱클톤(Singleton)
생성자를 private로 만들어 외부에서 생성자를 이용할 수 없게 제한하고 getInstance 메서드를 static화 하여 무조건 동일한 인스턴스가 반환되게 한다.
같이 학원을 다니던 분이 싱글톤과 static의 차이가 무엇이냐라고 질문해주셔서 이에 대해 정리도 해볼까한다.
static과 싱글톤은 동일하게 시스템 상에 단 하나만 존재하는 것을 만드는 일을 한다.
static은 변수나 메서드를 하나만 존재하게 만든다면 싱글톤은 객체를 하나만 존재하게 만든다고 보면 될 것 같다.
템플릿 적용
템플릿은 디자인 패턴은 아니지만 프로그램 코드나 UI에서 일정한 구조나 형태를 재사용하기 위한 방법이기에 같이 설명해본다. Car가 동작하기 위해서 start → run → stop 순으로 기능이 동작한다.
이를 메서드에 정의하고 이를 토대로 세부 기능을 상속받은 클래스에서 구현하게 하는 방법이다.