본문 바로가기

Design Pattern/구조 패턴(Structural Patterns)7

프록시(Proxy) 패턴 - 구조 패턴 (Structural Patterns) 프록시 패턴은 다른 개체에 대한 접근을 제어하기 위한 디자인 패턴이다. 프록시 개체는 실제 개체에 대한 인터페이스를 제공하면서, 접근을 제어하거나 추가 기능을 수행할 수 있다. 실제 개체에 대한 접근을 통제하고, 로깅, 캐싱, 권한 확인 등 다양한 추가 기능을 제공할 수 있다. 프록시 패턴에는 종류가 있다.  1. 가상 프록시 (Virtual Proxy) : 실제 개체의 생성을 지연하여, 필요한 시점에만 생성한다. 예로 이미지 로딩을 지연시킬 때 사용할 수 있다. 2. 보호 프록시 (Protection Proxy) : 접근 제어를 위해 사용된다. 예로  권한 접근을 제한할때 사용할 수 있다.3. 원격 프록시 (Remote Proxy) :  원격 개체에 대한 접근을 제어한다. 예로 서버의 개체를 로컬에 접.. 2024. 5. 23.
플라이웨이트(Flyweight) 패턴 - 구조 패턴 (Structural Patterns) 플라이웨이트 패턴은 개체를 가능한 한번에 공유하여 사용하도록 하여 메모리를 절약하는 구조적 디자인 패턴이다. 대량의 개체를 다룰 때 유용하며, 개체의 상태를 분리하여 공유 가능한 상태(Intrinsic State)와 공유 불가능한 상태(Extrinsic State)로 나누어 메모리 사용을 최소솨 한다.  1. 공유 가능한 상태(Instrinsic State) - 개체간에 공유 할 수 있는 상태이다. 변경되지 않으며, 모든 개체가 동일하게 유지하는 부분이다.  2. 공유 불가능한 상태 (Extrinsic State) - 개체마다 다를 수 있는 상태이다. 개체가 사용될 때 외부에서 전달되는 상태이다. 3. 플라이웨이트 팩토리 (Flyweight Factory) - 플라이웨이트 개체들을 생성하고 관리하는 역할.. 2024. 5. 23.
퍼사드(Facade) 패턴 - 구조 패턴 (Structural Patterns) 퍼사드 패턴은 복잡한 서브 시스템에 대한 단순화된 인터페이스를 제공하여, 사용자가 복잡한 시스템을 쉽게 사용할 수 있도록 돕는 디자인 패턴이다. 여러 클래스의 복잡한 상호작용을 감추고, 단순한 인터페이스를 통해서만 시스템에 접근할 수 있게 한다. 1. 단순한 인터페이스 제공 : 서브 시스템의 복잡한 인터페이스를 단순화하여 제공한다.2. 복잡성 은닉 : 서브시스템의 내부 동작을 숨기고 사용자는 퍼사드 인터페이스를 통해서만 시스템을 사용할 수 있다. 3. 서브시스템과의 독립성 : 퍼사드는 서브 시스템과 클라이언트 코드 간의 의존성을 줄여준다. 개발자라면 평소에도 퍼사드 패턴의 사용자이다.어떤 뜻인지 이해가 안될 수 있는데 우리는 평소에도 많은 라이브러리와 프레임워크를 이용한다.이게 사실은 퍼사드 패턴으로 제.. 2024. 5. 23.
데코레이터(Decorator) 패턴 - 구조 패턴 (Structural Patterns) 데코레이터 패턴은 개체에 동적으로 새로운 기능을 추가할 수 있게 해주는 디자인 패턴이다. 개체를 다양한 방법으로 확장할 수 있어 코드의 유연성과 재사용성을 높일 수 있으며, 기존 개체를 변경하지 않고 기능을 확장할 수 있다.  예를 들어 커피머신을 생각해 보자  커피머신의 기본은 당연히 커피이다. 하지만 우유나 설탕을 추가함으로써 여러 조합을 만들 수 있다.   Component 인터페이스는 커피의 공통 인터페이스 역할을 한다. // Coffee 인터페이스: 커피의 공통 기능 정의interface Coffee { String getDescription(); double getCost();}  ConcreateComponent 클래스 // BasicCoffee 클래스: 기본 커피class Bas.. 2024. 5. 23.
컴포지트(Composite) 패턴 - 구조 패턴 (Structural Patterns) 컴포지트 패턴은 개체들을 트리 구조로 구성하여 부분-전체 계층을 나타내는 디자인 패턴이다.  이 패턴을 사용하면 클라리언트가 단일 개체와 복합 개체(여러 개체로 구성된 개체)를 동일하게 다를 수 있다. 개별 개체와 여러 개체로 구성된 그룹을 같은 방식으로 처리할 수 있게 해준다.  간단하게 예시로 파일 시스템을 생각해보자 파일 시스템의 구조는 파일과 폴더일것이다. 이때 파일은 개별 개체이고 폴더는 여러 파일이나 다른 폴더를 포함할 수 있는 복합 개체이다. 컴포징트 패턴을 사용하면 파일과 폴더를 같은 방식으로 처리할 수 있다.  1. Component(구성 요소) : 파일과 폴더의 공통 인터페이스 2. Leaf(잎) : 개별 개체, 본 예제에서는 파일을 의미3. Composite (복합 개체) : 복합 개.. 2024. 5. 23.
브리지(Bridge) 패턴 - 구조 패턴 (Structural Patterns) 브리지 패턴은 추상화와 구현을 분리하여 둘을 독립적으로 확장할 수 있도록 하는 디자인 패턴이다.  여러 모양과 색상이 있다고 가정해보자. 빨간색 원파란색 사각형 모양과 색상을 조합하는 모든 경우를 각각 클래스로 정의하면 클래스의 수가 기하급수적으로 늘어난다.브리지 패턴을 사용해서 모양과 색상을 분리하고 이들을 독립적으로 확장 할 수 있도록 해보자. Shape 클래스는 추상화 역할을 한다.// Shape 클래스: 추상화 역할abstract class Shape { protected Color color; protected Shape(Color color) { this.color = color; } public abstract void draw();} Color 인터페이스는.. 2024. 5. 23.
어댑터(Adapter) 패턴 - 구조 패턴 (Structural Patterns) 어댑터 패턴은 두개의 서로 호환되지 않는 인터페이스를 가진 클래스들이 함께 동작 할 수 있도록 중간에 어댑터 역할을 하는 클래스를 두는 디자인 패턴이다. 간단한 예시로는 전기 어댑터를 살펴보면 좋다. 한국에서는 220V 콘센트를 사용하는데 미국에서는 110V콘센트를 사용한다. 이때 한국에서 가지고간 220V 전자 제품을 미국에서 사용하고 싶다면 어댑터를 사용하는것이다. // V220Socket 인터페이스: 220V 소켓public interface V220Socket { void connect();} // V220Appliance 클래스: 220V 전자 기기public class V220Appliance implements V220Socket { @Override public void c.. 2024. 5. 16.