
🐙 프록시 패턴이란? - 특정한 객체에 접근하기 전에 프록시를 지나서 접근하는 패턴, 여기서 프록시는 대리인이라는 뜻 - 미리 만들었지만 사용이 안된다면 메모리 낭비가 되기 때문에 실제로 사용되는 시점에서 초기화 지연하기 위해서 사용 - 유저가 권한이 있어야만 접근할 수 있도록 접근 제어 가능 - 프록시 내에 미리 캐싱을 해둔 데이터가 있다면 오퍼레이션까지 가지 않고 반환 - RealSubject 는 실제로 사용을 해야 하는 객체 - proxy는 인터페이스 타입으로 필드를 갖고 있음. 해당 필드를 통해 real subject 를 참조하고, 이를 감싸서 프록시로 들어오는 operation 중에 real subject 를 사용해야 하는 경우에는 사용하고, 추후에 작업을 할 수 있도록 함. 만일, 초기화 지연..

🐙 플라이웨이트 패턴이란? - 공통되는 부분을 따로 모아서 재사용하는 패턴 - 자주 변하는 속성과 자주 변하지 않는 속성을 분리하고, 재사용하여 메모리 사용을 줄임 🐙 플라이웨이트 패턴 구현해보기 필통에 필기구를 넣는다고 가정해보자. public class App { public static void main(String[] args) { PencilCase p1 = new PencilCase("jane", "볼펜", "빨간색"); PencilCase p2 = new PencilCase("jin", "볼펜", "빨간색"); PencilCase p3 = new PencilCase("new", "볼펜", "빨간색"); } } 위와 같이 각기 다른 필통에 빨간색 볼펜이 세번 반복되어 들어간다. 따라서 메모리를..

🐙 퍼사드 패턴이란? - 퍼사드는 건물의 입구쪽 전경을 의미 - 건물 안에 무엇이 있는지 알 수 없음 - 배관 / 수도가 어떻게 되어있는지 알 수 없음 - 퍼사드 패턴은 그 모든 디테일을 숨기는 것 - 복잡한 서브 시스템의 의존성을 최소화하는 패턴 - 클라이언트가 사용해야 하는 복잡한 서브 시스템 의존성을 간단한 인터페이스로 추상화할 수 있음 - 클라이언트는 퍼사드만을 사용하고, 복잡한 디테일은 그 뒤로 숨기는 것 - tightly coupled 가 아닌 loosely coupled 로 바꾸는 것 🐙 퍼사드 패턴 구현해보기 편지를 쓴다고 가정해보자. package FacadePattern.before; public class App { public static void main(String[] args)..

🐙 데코레이터 패턴이란? - 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴 - 기존의 코드를 변경하지 않으면서 부가적인 기능을 추가할 수 있는 패턴 - 런타임에 기존 기능을 확장할 수 있는 패턴 🐙 데코레이터 패턴 구현하기 주문을 해야하는데 재고는 최대 300개이고, 음수는 당연히 주문할 수 없다고 가정해보자. public class Client { private OrderService orderService; public Client(OrderService orderService) { this.orderService = orderService; } private void order(int count) { orderService.order(count); } public static voi..

🐙 컴포짓이란? - 하나 이상의 유사한 객체를 구성으로 설계된 객체 - 모두 유사한 기능을 나타낸다. 🐙 컴포짓 패턴이란? - 전체 계층 구조 / 계층 구조를 구성하는 부분적인 객체를 클라이언트가 동일하게 취급할 수 있도록 구조를 만드는 것 - 클라이언트 입장에서는 전체나 부분이나 모두 동일한 '컴포넌트'로 인식할 수 있는 계층 구조를 만드는 패턴 - 트리 구조로 작성됨 - 클라이언트 코드는 leaf 와 composite 클래스를 참조하는 것이 아니라 공동 인터페이스인 component 를 참조한다. 🐙 컴포짓 패턴 구현하기 Component public interface Component { int getPrice(); } 해당 인터페이스를 구현하는 모든 객체들이 getPrice 메서드를 구현하도록 강..

🐙 브릿지 패턴이란? - 객체에서 동작을 처리하는 구현부와 확장을 위한 추상부를 분리하는 것 - 기능을 처리하는 클래스 / 구현을 담당하는 추상 클래스로 구별 - 새로운 인터페이스를 정의하여 기존 코드의 변경 없이 기능 확장이 가능 🐙 브릿지 패턴 구현하기 위와 같은 패턴 구조를 갖는 코드를 구현할 것이다. 1. 동작을 처리하는 구현부 Color (Implementation) : 기능을 구현하기 위한 인터페이스 - 해당 코드에서는 색을 칠하는 것 Blue (Concrete Implementation) : 실제로 기능을 구현 - 해당 코드에서는 '파란'색을 칠하도록 하는 것 2. 확장을 위한 추상부 Brush(Abstraction): 구현 부분에 해당하는 클래스의 인스턴스를 가지고 구현부 메서드를 호출 -..

🐙 어댑터 패턴이란? - 기존 코드를 클라이언트가 사용하는 인터페이스의 구현체로 바꿔주는 패턴 - 클라이언트가 사용하는 인터페이스를 따르지 않는 기존 코드를 재사용할 수 있도록 해주는 패턴 🐙 어댑터 패턴의 필요성 - 클라이언트와 구현된 인터페이스를 분리시킬 수 있음 - 향후 인터페이스가 바뀌더라도 변경 내역이 어댑터에 캡슐화되어 클라이언트는 바뀔 필요가 없음 🐙 어댑터 패턴 구현하기 Adaptee public interface Rabbit{ public void run(); public void hop(); } 인터페이스 Rabbit 을 구현한 클래스 class WildRabbit implements Rabbit{ @override public void run(){ System.out.println("..

🐙 프로토타입 패턴이란? - 기존 인스턴스를 복제하여 새로운 인스턴스를 만드는 방법 - 객체의 생성이 시간이 오래 걸리는 경우에 사용 ex. 네트워크를 거치거나 db에서 가져와야 하는 경우 🐙 프로토타입 패턴 구현하기 class PencilCase implements Cloneable{ @Override protected Object clone() throws CloneNotSupportedException{ return super.clone(); } } Object 클래스의 clone 메서드를 이용해야 한다. 그러나 이는 protected 로 설정되어 있기 때문에 clone 메서드를 사용하고자 하는 클래스에서 Cloneable 인터페이스를 구현하고 해당 메서드를 재정의해줘야 한다. Pencil penc..