디자인 패턴이란?
특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책이다.
소스나 기계코드로 바로 전활될 수 있는 완성된 디자인은 아니며, 다른 상황에 맞게 사용될 수 있는 문제들을 해결하는데에 쓰이는 서술이나 템플릿이다.
디자인 패턴은 프로그래머가 어플리케이션이나 시스템을 디자인할 때 공통된 문제들을 해결하는데에 쓰이는 형식화 된 가장 좋은 관행이다.
디자인 패턴의 종류
생성(Creational) 패턴
객체 생성 혹은 조합에 관한 패턴.
- 싱글톤 (Singleton)
- 빌더 (Builder)
- 팩토리 메서드 (Factory Method)
- 추상 팩토리 (Abstract Factory)
- 프로토타입 (Prototype)
구조(Structural) 패턴
객체를 조합해 더 큰 구조를 만드는 패턴.
- 어댑터 (Adaptor)
- 브릿지 (Bridge)
- 컴포지트 (Composit)
- 데코레이터 (Decorator)
- 퍼사드 (Facade)
- 플라이웨이트 (Flyweight)
- 프록시 (Proxy)
행동(Behavioral) 패턴
객체 사이의 책임분배(결합도⬇️)나 커뮤니케이션에 관한 패턴
- 책임 연쇄 (Chain of Responsibility)
- 커맨드 (Command)
- 인터프리터 (Interpreter)
- 이터레이터 (Iterator)
- 미디에이터 (Mediator)
- 메멘토 (Memeento)
- 옵저버 (Observer)
- 스테이트 (State)
- 전략 (Strategy)
- 템플릿 메서드 (Template Method)
- 비지터 (Visitor)
생성 패턴 - 싱글톤(Sigleton)
- 클래스의 인스턴스가 단 1개임을 보장해야한다.
- 인스턴스 생성을 제어할 수 있어야한다.
- 1개 뿐인 인스턴스에 쉽게 접근할 수 있어야 한다.
- 클래스 다이어그램을 살펴보면, private 변수 + private 생성자 + public 메소드를 가지는 것을 알 수 있다.
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
public class Main{
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
}
}
- SingletonHolder를 사용하면 Thread safe/ synchronized 등의 고려를 할 필요가 없다.
생성 패턴 - 빌더 (Builder)
- 보통 직접 구현하기 보다 Lombok을 사용된다.
- 복잡한 객체의 생성방법과 표현방법을 분리하기 위해 사용한다.
- 생성방법과 구성방법 모두 캡슐화 할때 사용한다.
- 객체생성에 필요한 파라미터가 너무 많아, 생성자 오버로딩이 과할때 사용되기도 한다.
GitHub: 빌더패턴 구현 코드
생성 패턴 - 팩토리(Factory Method)
- 복잡한 객체 생성을 캡슐화 하기 위해 사용한다.
- 생성은 다른 클래스(Factory)에게 위임한다.
- 어떤 인스턴스를 만들어야 할지 알 수 없을 때 사용한다.
GitHub: 팩토리패턴 구현 코드
📚 참고
위키백과: 소프트웨어 디자인 패턴