공통으로 사용하는 클래스를 만드는 팩토리 클래스를 두고 사용 클래스의 인스턴스가 팩토리 클래스 내에 있을 시에는 꺼내서 사용하고, 없을 시에는 새로 생성해서 사용하는 패턴 플라이 웨이트 패턴을 통해 메모리 공간을 절약할 수 있다. 기본 설계 FlyWeight를 다루는데 Client가 직접적으로 다루지 않고, FlyWeightFactory를 통해 다루는 것을 볼 수 있다. 예시 Client가 어떤 Image라는 객체를 반복적으로 필요로 하고자 할 때, Image 객체는 반복적으로 새로운 객체로 생성하게 된다. 그러나 이 때, 플라이웨이트 패턴을 사용하게 되면, Image 객체를 반복적으로 새로운 객체로 생성하는 것이 아니라 기존에 Image 객체가 있으면 기존 객체를 Client에게 전달하는 것이다. 이렇..
퍼사드 패턴 복잡한 과정을 간단하게 표현하는 퍼사드 패턴을 이해해보자. Facade는 "건물의 정면"을 의미하는 단어로 내부의 클래스를 추상화한 인터페이스를 외부에 제공해주는 의미를 지닌 패턴이다. 기본 설계 소스 예제를 통해 살펴보자 package com.pattern.ch14_facade.system; public class Facade { private HelpSystem01 helpSystem01; private HelpSystem02 helpSystem02; private HelpSystem03 helpSystem03; public Facade() { helpSystem01 = new HelpSystem01(); helpSystem02 = new HelpSystem02(); helpSystem0..
옵저버 패턴 한 객체의 상태 변화에 따라 다른 객체의 상태도 연동되도록 일대다 객체 의존 관계를 구성하는 패턴이다. 그럼 언제 사용하는 걸까? 데이터의 변경이 발생했을 경우 상대 객체에 의존하지 않으면서 데이터 변경을 통보하고자 할 때 사용하기 유용하다. Ex 1. 탐색기는 새로운 파일이 추가되거나 기존 파일이 삭제되었을 때 다른 탐색기에게 즉시 변경을 통보해야한다. Ex 2. 차량 연료량 클래스는 연료량이 부족한 경우 연료량에 관심을 가지는 구체적인 클래스(연료량 부족 경고 클래스, 주행 가능 거리 출력 클래스)에 직접 의존하지 않는 방식으로 연료량의 변화를 통보해야한다. 옵저버 패턴은 통보 대상 객체의 관리를 Subject 클래스와 Observer 인터페이스로 일반화한다. 이를 통해 데이터 변경을 통..
다양한 처리 방식을 유연하게 처리할 수 있다. 어떤 요청이 그 요청을 담당하는 객체에 들어오면 요청에 대해서 담당하는 것이 일반적이지만, 만약 해당 요청을 수행하지 못하는 객체라면 이 요청을 수행하기 위해 객체들을 연결 리스트와 같은 사슬 방식으로 연결하여 다음 객체에게 책임을 넘기는 형태를 말한다. 이는 요청을 보내는 객체와 이를 처리하는 객체간의 결합도를 느슨하게 하기 위한 방법이며 여러 객체에 처리 기회를 주는 것이다. 기본 설계 예제 : 사칙연산 프로그램 //Main public class ChainMain { public static void main(String[] args) { Calculator plus = new PlusCalculator(); Calculator sub = new Sub..
방문자 패턴을 이용하여 객체에서 처리를 분리해서 사용할 수 있다. 기본 설계 예제 소스 Visitor 및 Visitable public interface Visitor { public void visit(Visitable visitable); } public interface Visitable { public void accept(Visitor visitor); } VisitorA 및 VisitableA public class VisitorA implements Visitor{ private int ageSum; public VisitorA() { ageSum = 0; } @Override public void visit(Visitable visitable) { if(visitable instanceof..
동적으로 책임 추가가 필요할 때 데코레이터 패턴을 사용할 수 있다. 기본 설계 Component : 실질적인 인스턴스를 컨트롤하는 역할 ConcreteComponent : Component의 실질적인 인스턴스 부분이며, 책임의 구현 부분 Decorator : Component와 Concrete Decorator를 동일 시 하도록 해주는 역할 ConcnreteDecorator : 실질적인 장식 인스턴스 및 정의이며 추가된 책임의 구현 부분 실습 요구 사항 커피 제조 방법 에스프레소 : 커피의 기본 아메리카노 : 에스프레소 + 물 카페라떼 : 에스프레소 + 스팀밀크 헤이즐넛 : 아메리카노 + 헤이즐넛 시럽 카페모카 : 카페라떼 + 초콜릿 캬라멜 마끼야또 : 카페라떼 + 카라멜 시럽 IBeverage : 커피..
컴포지트 패턴을 통해 트리 구조를 구현할 수 있다. 컴포지트란 하나 이상의 유사한 객체를 구성으로 설계된 객체로 모두 유사한 기능을 나타낸다. 이를 통해 객체 그룹을 조작하는 것처럼 단일 객체를 조작할 수 있다. 컴포지트 패턴이란? 컴포지트 패턴은 클라이언트가 복합 객체나 단일 객체를 동일하게 취급하는 것을 목적으로 한다. 여기서 컴포지트의 의도는 트리 구조로 작성하여 전체-부분 관계를 표현하는 것이다. 컴포지트 패턴은 언제 사용하는가? 복합 객체와 단일 객체의 처리 방법이 다르지 않을 경우, 전체-부분 관계로 정의할 수 있다. 기본 설계 Component : 모든 표현할 요소들의 추상적인 인터페이스이다. Leaf : Component 인터페이스를 구현하고 구현체 클래스를 나타낸다. (단일 객체에 해당된..
어댑터 패턴과 브릿지 패턴을 연결하여 이해한다. 기능 부분과 구현 부분을 분리하는 것이 이번 패턴의 키워드이다. 브릿지 패턴은 잘 사용되지 않고, 어댑터 패턴과 매우 비슷하다는 것을 먼저 알고 들어가자. 먼저 브릿지 패턴을 사용하지 않은 소스를 확인해보자 요구사항은 입력한 단어를 모스부호 형태로 출력하는 것이다. public class MorseCode { public void dot() { System.out.print("·"); } public void dash() { System.out.print("-"); } public void space() { System.out.print(" "); } } public class PrintMorseCode extends MorseCode { //blue pu..
- Total
- Today
- Yesterday
- try with resources
- 이펙티브자바
- 복사 팩토리
- 빌더 패턴
- flatMap
- JPA
- junit
- try catch finally
- 김영한
- jdk버전
- @Lazy
- 팩토리 메소드 패턴
- effectivejava
- 생성자
- 빈 순환 참조
- Spring
- ifPresent
- Effective Java
- 인프런
- springboot
- 이펙티브 자바
- 정적팩터리메서드
- java
- package-private
- 점층적 생성 패턴
- 스프링부트
- 연관관계
- 자바8
- java8
- mustache
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |