디자인패턴
템플릿 메서드 패턴
템플릿 메서드 패턴이란? 💡 특정 작업을 처리하는 일부분을 서브 클래스로 캡슐화하여 전체적인 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내용을 바꾸는 패턴입니다 우리가 흔히 패턴이라고 인식하지 않고 쓰는 패턴이다. 라면을 끓이는 단계를 템플릿 메서드 패턴의 예시로 들어보겠습니다. public abstract class RamenRecipe { final void prepareRamen() { preparePot() // 냄비 준비 boilWater(); // 물을 끓이기 putBasicMaterial(); // 기본 면, 스프 넣기 if(addMore()) { addIngredient(); // 더 넣고 싶은 것 넣기 } } void preparePot() { System.out.println("냄비..
팩토리메서드 패턴
팩토리 메서드 패턴이란? 💡 부모 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며, 자식 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴 특정 상황에서 조건에 따라서 부모 클래스의 구현체를 다르게 하여 생성해야할 때가 있습니다. 클라이언트에서 조건에 따라 분기하여 생성하면 되겠지만, 클라이언트가 많아진다면 어떨까요? 분기하여 생성하는 로직의 코드가 클라이언트마다 반복되고, 추가적인 분기점이 생긴다면 모든 클라이언트 코드를 수정해야하는 일이 생깁니다. 예시를 한번 들어 보겠습니다. 계산기로 예시를 들어보겠습니다. 최상위 클래스인 TokenType는 계산식을 잘랐을 때 존재할 수 있는 타입의 종류를 의미합니다. TokenType의 구현체에 따라서 하는 일이 다른데, 그래서 클라이언트에서 Toke..
어뎁터 패턴
어댑터 패턴이란? 💡 서로 호환되지 않는 인터페이스를 가진 객체들이 상호작용할 수 있도록 두 객체 사이에서 호환을 해주는 구조를 만드는 것입니다. 어댑터 패턴을 어떤 경우에 사용할까? A 인터페이스를 사용하고 싶은데, A 타입의 데이터로만 작동한다. 하지만 나는 B 타입의 데이터를 입력받아 사용해야할 때 → 궁여지책으로 A 인터페이스를 내가 원하는 B타입으로 작동하도록 수정할 수도 있지만, 그렇게 한다면 A 인터페이스에 의존하는 코드들을 수정해줘야한다. 또한, A 쪽의 코드에 내가 접근하지 못하는 경우라면, 이 해결방식조차 이용할 수 없다. 어댑터 패턴을 사용한다면? 클라이언트 코드와 사용하고자하는 코드의 수정 없이 호환 가능한 구조를 만들 수 있다. → OCP 타입을 변환해주는 로직을 분리할 수 있다...
데코레이터 패턴
데코레이터 패턴이란? 객체에 책임을 동적으로 추가하는 패턴을 말합니다. 데코레이터 패턴을 주로 사용하는 상황 클래스의 요소들을 조금씩 수정해가면서 사용하는 경우 여러 요소들을 조합하여 구성하는 경우 예시 데코레이터 패턴을 설명하는 대표적인 예시로 커피가 있습니다. 아메리카노 = 에스프레소 + 물 카페라떼 = 에스프레소 + 우유 + 휘핑크림 이런식으로 다양한 재료들을 합쳐서 커피를 만들어야한다고 합시다. 만약, 재료들을 전부 다 클래스로 구현해준다면 굉장히 비효율적일 것입니다. 새롭게 커피를 개발하여 새로운 재료가 필요하다면, 그럴 때마다 새롭게 재료의 클래스를 만들어줘야하기 때문입니다. 이를 해결하기 위해 데코레이터 패턴을 적용해봅시다. public interface Ingredient { String ..
프록시 패턴
프록시 패턴이란? 프록시는 “대리”라는 의미를 가진다. 그렇다면 무엇을 대리하는 것일까? 실제 객체의 ‘존재’를 대신한다. 실제 객체로 접근하기 전에 일단 프록시 객체를 거쳐가게끔 하는 방식이다. 구현 방식 프록시 객체는 실제 객체와 완벽히 같은 인터페이스를 구현하여야 한다. 그래야 다형성을 통해 프록시 객체가 실제 객체의 존재를 대신할 수 있다. 일단 동작을 위해 실제 객체의 존재를 대신하여 프록시 객체를 생성하여 메모리 상에 올려 놓는다. 이때, 프록시 객체는 실제 객체의 참조값을 갖고 있다. 실제 객체에 대한 요청이 들어오면 그때, 요청을 받은 프록시 객체가 실제 객체를 생성한다. 실제 객체가 로직을 실행합니다. 한번 실제 객체가 생성이 되었다면, 프록시 객체는 생성되어있는 실제 객체를 호출해줍니다..