본문 바로가기

디자인패턴14

커맨드 패턴 요청을 캡슐화 하여 호출자(invoker)와 수신자(receiver)를 분리하는 패턴 요청을 처리하는 방법이 바뀌더라도, 호출자의 코드는 변경되지 않는다. 구현 방법 장단점 장점 기존 코드를 변경하지 않고 새로운 커맨드를 만들 수 있다. 수신자의 코드가 변경되어도 호출자의 코드는 변경되지 않는다. 커맨드 객체를 로깅, DB에 저장, 네트워크로 전송 하는 등 다양한 방법으로 활용할 수도 있다. 단점 코드가 복잡하고 클래스가 많아진다 실무 적용 사례 자바 Runnable 람다 메소드 레퍼런스 스프링 SimpleJdbcInsert SimpleJdbcCall 예제 코드 https://github.com/jsyang-dev/study-designpattern/tree/master/src/main/java/me/s.. 2022. 3. 20.
책임 연쇄 패턴 요청을 보내는 쪽(sender)과 처리하는 쪽(receiver)으로 분리하는 패턴 핸들러 체인을 사용해서 요청을 처리한다. 구현 방법 장단점 장점 클라이언트 코드를 변경하지 않고 새로운 핸들러를 체인에 추가할 수 있다. 각각의 체인은 자신이 해야 하는 일만 한다. 체인을 다양한 방법으로 구성할 수 있다. 단점 디버깅이 조금 어렵다. 실무 적용 사례 자바 서블릿 필터 스프링 스프링 시큐리티 필터 예제 코드 https://github.com/jsyang-dev/study-designpattern/tree/master/src/main/java/me/study/designpattern/chain_of_responsibilities 2022. 3. 9.
프록시(Proxy) 패턴 특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴 초기화 지연, 접근 제어, 로깅, 캐싱 등 다양하게 응용해 사용 할 수 있다. 구현 방법 장단점 장점 기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있다. 기존 코드가 해야 하는 일만 유지할 수 있다. 기능 추가 및 초기화 지연 등으로 다양하게 활용할 수 있다. 단점 코드의 복잡도가 증가한다. 실무 적용 사례 자바 다이나믹 프록시, java.lang.reflect.Proxy 스프링 스프링 AOP 예제 코드 https://github.com/jsyang-dev/study-designpattern/tree/master/src/main/java/me/study/designpattern/proxy 2022. 2. 14.
플라이웨이트(Flyweight) 패턴 객체를 가볍게 만들어 메모리 사용을 줄이는 패턴 자주 변하는 속성(또는 외적인 속성, extrinsit)과 변하지 않는 속성(또는 내적인 속성, intrinsit)을 분리하고 재사용하여 메모리 사용을 줄일 수 있다. 구현 방법 장단점 장점 애플리케이션에서 사용하는 메모리를 줄일 수 있다. 단점 코드의 복잡도가 증가한다. 실무 적용 사례 자바 Integer.valueOf(int) 캐시를 제공한다. https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html#valueOf-int 예제 코드 https://github.com/jsyang-dev/study-designpattern/tree/master/src/main/java/me/study/designp.. 2022. 2. 10.
데코레이터(Decorator) 패턴 기존 코드를 변경하지 않고 부가 기능을 추가하는 패턴 상속이 아닌 위임을 사용해서 보다 유연하게(런타임에) 부가 기능을 추가하는 것도 가능하다. 구현 방법 장단점 장점 새로운 클래스를 만들지 않고 기존 기능을 조합할 수 있다. 컴파일 타임이 아닌 런타임에 동적으로 기능을 변경할 수 있다. 단점 데코레이터를 조합하는 코드가 복잡할 수 있다. 실무 적용 사례 자바 InputStream, OutputStream, Reader, Writer의 생성자를 활용한 Wrapper java.util.Collections가 제공하는 메소드들 활용한 Wrapper javax.servlet.http.HttpServletRequest/ResponseWrapper 스프링 ServerHttpRequestDecorator 예제 코드.. 2022. 2. 1.
브릿지(Bridge) 패턴 추상적인 것과 구체적인 것을 분리하여 연결하는 패턴 하나의 계층 구조일 때 보다 각기 나누었을 때 독립적인 계층 구조로 발전시킬 수 있다. 구현 방법 장단점 장점 추상적인 코드를 구체적인 코드 변경 없이도 독립적으로 확장할 수 있다. 추상적인 코드과 구체적인 코드를 분리하여 수 있다. 단점 계층 구조가 늘어나 복잡도가 증가할 수 있다. 실무 적용 사례 자바 JDBC API, DriverManger와 Driver SLF4J, 로깅 퍼사드와 로거 스프링 Portable Service Abstraction 예제 코드 https://github.com/jsyang-dev/study-designpattern/tree/master/src/main/java/me/study/designpattern/bridge 2022. 1. 29.
퍼사드 패턴 복잡한 서브 시스템 의존성을 최소화하는 방법 클라이언트가 사용해야 하는 복잡한 서브 시스템 의존성을 간단한 인터페이스로 추상화할 수 있다 구현 방법 장단점 장점 서브 시스템에 대한 의존성을 한곳으로 모을 수 있다 단점 퍼사드 클래스가 서브 시스템에 대한 모든 의존성을 가지게 된다 실무 적용 사례 스프링 Spring MVC 스프링이 제공하는 대부분의 기술 독립적인 인터페이스와 그 구현체 예제 코드 https://github.com/jsyang-dev/study-designpattern/tree/master/src/main/java/me/study/designpattern/facade 2022. 1. 28.
템플릿 메소드(Template method) 패턴 템플릿 메소드(Template method) 패턴 Algorithm 구조를 서브 클래스가 확장할 수 있도록 템플릿으로 제공하는 방법 추상 클래스는 템플릿을 제공하고 하위 클래스는 구체적인 Algorithm을 제공한다. 템플릿 콜백(Template-Callback) 패턴 콜백으로 상속 대신 위임을 사용하는 템플릿 패턴 상속 대신 익명 내부 클래스 또는 람다 표현식을 활용할 수 있다. 구현 방법 장단점 장점 템플릿 코드를 재사용하고 중복 코드를 줄일 수 있다. 템플릿 코드를 변경하지 않고 상속을 받아서 구체적인 Algorithm만 변경할 수 있다. 단점 리스코프 치환 원칙을 위반할 수도 있다. 하위 클래스에서 의도치 않은 행동으로 상속할 경우 발생 (final로 상속을 막으면 어느정도 방지 가능) 알고리듬 .. 2022. 1. 19.
어댑터(Adapter) 패턴 기존 코드를 클라이언트가 사용하는 인터페이스의 구현체로 바꿔주는 패턴 클라이언트가 사용하는 인터페이스를 따르지 않는 기존 코드를 재사용할 수 있게 해 준다. 구현 방법 장점과 단점 장점 기존 코드를 변경하지 않고 원하는 인터페이스 구현체를 만들어 재사용할 수 있다.(개방-폐쇄 원칙) 기존 코드가 하던 일과 특정 인터페이스 구현체로 변환하는 작업을 각기 다른 클래스로 분리하여 관리할 수 있다.(단일 책임 원칙) 단점 새 클래스가 생겨 복잡도가 증가할 수 있다. 경우에 따라서는 기존 코드가 해당 인터페이스를 구현하도록 수정하는 것이 좋은 선택이 될 수도 있다. 실무 적용 사례 자바 java.util.Arrays#asList(T…) java.util.Collections#list(Enumeration), ja.. 2022. 1. 13.
프로토타입(Prototype) 패턴 기존 인스턴스를 복제하여 새로운 인스턴스를 만드는 방법 복제 기능을 갖추고 있는 기존 인스턴스를 프로토타입으로 사용해 새 인스턴스를 만들 수 있다. 구현 방법 장점과 단점 장점 복잡한 객체를 만드는 과정을 숨길 수 있다. 기존 객체를 복제하는 과정이 새 인스턴스를 만드는 것보다 비용(시간 또는 메모리)적인 면에서 효율적일 수도 있다. 추상적인 타입을 리턴할 수 있다. 단점 복제한 객체를 만드는 과정 자체가 복잡할 수 있다. (특히, 순환 참조가 있는 경우) 실무 적용 사례 자바 Object 클래스의 clone 메소드와 Cloneable 인터페이스 얕은 복사(shallow copy)와 깊은 복사(deep copy) Collections 을 사용할 때 대부분 인터페이스 타입으로 인스턴스를 사용하기 때문에 c.. 2022. 1. 10.