정적 팩터리와 생성자는 선택적 매개변수가 많을 때 적절히 대응하기가 어렵다는 점이 있다. 그럼 이런 선택적 매개변수가 많을 때 클래스는 어떤 식으로 대응을 할까? 점층적 생성자 패턴 사용 점층적 생성자 패턴은 필수 매개변수만 받는 생성자와 선택 매개변수를 받는 생성자 여러개를 모두 두어 클라이언트가 요구하는 사항에 따라 객체를 생성하는 패턴 방식이다. public class NutritionFacts { private final int servingSize; // (mL, 1회 제공량) 필수 private final int servings; // (회, 총 n회 제공량) 필수 private final int calories; // (1회 제공량당) 선택 private final int fat; // (g..
지난 포스팅 때, 책을 그저 적기만 한 것 같아 다시 한번 포스팅을 시작했다.. 생성자와 정적 팩터리 메서드 보통 클래스의 인스턴스는 public 생성자를 활용하여 생성한다. 그런데 클래스 자체는 생성자와 별도로 아래와 같은 정적 팩토리 메소드를 제공할 수 있다. public static int testMethod() { return 0; } 위에서 설명한 바와 같이 클래스에서는 클라이언트에게 public 생성자를 제공해주지만 이 뿐만 아니라 정적 팩토리 메소드도 제공해줄 수 있다. //public 생성자 public class MyBook { public MyBook() {} } //static factory method public class MyBook { private MyBook() {} pub..
공통으로 사용하는 클래스를 만드는 팩토리 클래스를 두고 사용 클래스의 인스턴스가 팩토리 클래스 내에 있을 시에는 꺼내서 사용하고, 없을 시에는 새로 생성해서 사용하는 패턴 플라이 웨이트 패턴을 통해 메모리 공간을 절약할 수 있다. 기본 설계 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 : 커피..
- Total
- Today
- Yesterday
- try with resources
- 김영한
- jdk버전
- 정적팩터리메서드
- 빈 순환 참조
- 연관관계
- 인프런
- JPA
- springboot
- 빌더 패턴
- 팩토리 메소드 패턴
- junit
- 생성자
- ifPresent
- 점층적 생성 패턴
- java8
- try catch finally
- 복사 팩토리
- 자바8
- 이펙티브자바
- package-private
- mustache
- flatMap
- 이펙티브 자바
- effectivejava
- 스프링부트
- @Lazy
- Effective Java
- Spring
- java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |