본문 바로가기

개발

일반적인 디자인 패턴 종류


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




맨 위로