1. 디자인 패턴이란?
- 객체지향 프로그래밍에서 공통적인 디자인 문제를 찾아내고 해결하는 가이드라인을 말함.
- 특정 유형의 프로그래밍 문제를 해결하는 방식을 제공해주는 역할을 함.
2. 디자인 패턴을 사용하는 이유
- 프로그래머들의 경험과 지혜를 모아서 공통적인 소프트웨어 디자인 문제를 해결하는 데 도움이 될 수 있음.
- 디자인 패턴은 교육의 도구이자 프로그래밍에 필수적인 자원.
- 디자인 문제와 그 해결책을 논할 때 디자인 패턴이 간결한 용어모음을 제공.
- 다른 프로그래머와 일상적인 논의를 할 때, 디자인 문서를 작성할 때, 프로그램에 주석을 달 때 등 다른 프로그래머와 디자인에 관한 의사결정에 관해 얘기할 때 이런 용어가 도움이 됨.
3. 일반적인 디자인 패턴
- 생성 패턴 : 싱글톤, 빌더, 팩토리 메소드, 추상 팩토리.
-> 클래스 선택 및 객체 생성을 관리하기 위한 패턴.
-> 직접 생성하는 대신 애플리케이션의 다른 부분에서 객체를 생성하게 함.
-> 인스턴스의 생성 및 그에 대한 접근을 제한함
- 싱글톤(Singleton) 패턴
-> 어떤 클래스의 인스턴스 개수가 최대 한 개를 넘지 않도록 함.
-> 애플리케이션에서 새 인스턴스를 만들 수 없으며, 모든 메소드는 싱글톤을 통해서만 액세스할 수 있음.
- 싱글톤 단점
-> 멀티 스레드 환경에서는 메소드를 동기화시켜야 하기 때문에 싱글톤의 상태에 대한 엑세스가 느려질 수 있음.
-> 싱글톤 초기화 시간 때문에 애플리케이션 구동 시간이 느려질 수 있음.
-> 자원을 필요한 것보다 오래 점유하고 있을 수 있음.
- 빌더(Builder) 패턴
-> 객체가 어떤 식으로 구축되는지 모르는 상황에서 단계별로 객체를 생성하는 패턴.
-> 빌더의 인스턴스를 만들고 빌더에서 객체를 대신 만들도록 하는 방식.
-> 객체 초기화 시 여러 생성자 매개변수가 필요한 경우 이 빌더 패턴이 유용함.
-> 객체를 초기화하는 과정이 깔끔하고 이해하기 좋음.
-> 초기화 매개변수를 추가하거나 제거하기도 편함.
-> 객체 생성이 복잡하거나 몇 단계를 거쳐 생성해야 할 때 빌더 패턴 사용.
-> 예제 클래스
class Window {
private boolean dialog;
private boolean modal;
private boolean visible;
public Window(boolean dialog, boolean visible, boolean modal){
this.dialog = dialog;
this.modal = modal;
this.visible = visible;
}
// (생략)
}
public class WindowBuilder {
private boolean dialog;
private boolean modal;
private boolean visible;
public WindowBuilder(){}
public WindowBuilder setDialog(boolean flag){
this.dialog = flag;
return this;
}
public WindowBuilder setModal(boolean flag) {
this.modal = flag;
return this;
}
public WindowBuilder setVisible(boolean flag) {
this.visible = flag;
return this;
}
public Window build(){
return new Window(dialog, modal, visible);
}
public static void main(String[] args) {
// Window 객체를 직접 생성하는 것보다
Window w1 = new Window(false, true, true);
// WindowBuilder 인스턴스를 써서 새 객체의 초기 상태를 정의하는 식
Window w2 = new WindowBuilder().setDialog(false).setModal(true).setVisible(true).build();
}
}
- 팩토리 메소드(Factory Method) 패턴
-> 새 객체를 만들어서 리턴하기 위한 용도로 만들어진 모든 메소드라는 개념을 클래스 계층구조에 적용.
-> 베이스 클래스에서는 서브클래스에서 오버라이드할 팩토리 메소드를 정의.
-> 새 객체가 생성되는 방법은 각 서브클래스에서 결정.
-> 추상 팩토리 패턴을 구현하기 위해 팩토리 메소드 패턴이 종종 쓰임.
- 추상 팩토리 패턴
-> 다른 객체를 만들 수 있는 객체를 팩토리라고 부름.
-> 추상 팩토리 패턴은 팩토리 구현과 그 팩토리를 사용하는 코드를 갈라주는 패턴.
-> 어떤 추상 클래스로부터 상속된 일련의 팩토리 클래스로 구현됨.
-> 실제 클래스가 아닌 추상 클래스를 통해서만 팩토리를 참조함.
-> 서로 다른 팩토리를 쓸 때, 또는 팩토리 클래스가 하나 밖에 없을 때는 사용하지 않음.
-> 팩토리 메소드 패턴과 밀접하게 연관되어 있음.
-> 싱글톤 패턴을 사용할 때가 많음.
- 행위 패턴 : 반복자, 옵저버
-> 클래스와 객체가 서로 작용하고 통신하는 방법에 관한 패턴.
- 반복자 패턴
-> 어떠 자료구조에 들어있는 모든 원소를 종주할 수 있음.
-> 각 원소가 어떤 식으로 저장되고 표현되는지에 대해 몰라도 됨.
-> 종류가 다양하며, 각각 장단점이 있음
-> 간단한 반복자는 원소를 한 방향으로만 종주하고 기반 자료구조는 건드릴 수 없음.
-> 복잡한 반복자는 양방향 종주가 가능하고 기반 자료구조의 원소 추가 삭제도 가능함.
- 옵저버 패턴
-> 객체의 상태에 관심을 가지고 있는 옵저버에게 자신의 상태가 바뀌었음을 알릴 수 있음.
-> 갱신 사항을 알려주기 위해 만들어 놓은 어떤 인터페이스를 써서 대상에 등록함.
-> 모델 -뷰-컨트롤러(MVC) 구조도 옵저버 패턴의 일종. 모델이 변경되면 자동으로 뷰가 새로 그려지기 때문.
- 구조 패턴 : 데코레이터
-> 클래스와 객체 사이의 관계를 구성하는 범주의 패턴.
-> 서로 연관된 객체들을 함께 사용하여 원하는 일을 하기 위한 가이드 라인 제공.
- 데코레이터 패턴
-> 한 객체를 그 객체와 같은 인터페이스를 구현하는 다른 객체로 감싸서 객체의 형태를 바꿔주는 패턴.
-> 래퍼(wrapper) 패턴이라고 부름.
-> 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴.
-> 기능 확장이 필요할 때 서브클래스 대신 쓸 수 있는 유연한 대안이 될 수 있음.
-> 동적으로 객체의 추가적인 기능들을 가진 객체를 덧붙여 꾸밀 수 있음.
출처 : http://www.hanbit.co.kr/store/books/look.php?p_code=B9005920688
'개발' 카테고리의 다른 글
[Spring] MySQL 연결 및 테스트 (0) | 2017.07.04 |
---|---|
[JAVA] 싱글톤 구현 예제 (0) | 2017.07.04 |
[MariaDB] ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. (0) | 2017.05.19 |
[알고리즘 문제] 콜라츠 추측 (0) | 2017.05.10 |
[알고리즘 문제] 정수 내림차순으로 배치하기 (0) | 2017.04.24 |