본문 바로가기

Design Pattern24

플라이웨이트(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.
프로토타입(Prototype) - 생성 패턴(Creational Patterns) 프로토타입 패턴은 개체를 생성하는 디자인 패턴이다. 새로운 개체를 만들기 위해 기존의 개체를 복제하는 방법을 사용하는데 특히 개체 생성 과정이 복잡하거나 자원을 많이 소모할 때 유용하게 사용할 수 있다.기존에 만들어진 개체를 사용하여 새로운 개체를 생성하는 게 핵심인데 복제한 개체의 프로토타입(원본)을 가지고 있고, 이 원본 개체를 복제함으로써 새로운 개체를 빠르고 효율적으로 생성할 수 있다.  프로토타입 개체 정의 : 복제될 개체의 원분이 되는 프로토타입 개체를 정의한다. 이 개체는 모든 상태와 데이터를 가지고 있어야 하며, 자신을 복제할 수 있는 메커니즘을 제공해야 한다.  복제(클로닝) 메서드 : 프로토타입 개체는 자신의 복사본을 만들어 반환할 수 있는 clone() 메서드 같은 복제 메커니즘을 제.. 2024. 5. 15.
빌더(Builder) - 생성 패턴(Creational Patterns) 빌더 패턴은 개체의 생성 과정을 단계별로 분할하고, 그 과정을 캡슐화하여 복잡한 개체를 조립할 수 있게 도와주는 패턴이다. 이 패턴은 특히 복잡한 구성을 가진 개체를 생성할 때 유용하다. 동일한 생성 과정을 통해 다양한 표현과 구성의 개체를 만들 수 있다.  이 패턴의 구성을 먼저 보자  Builder : 개체의 여러 부분을 생헝하는 방법을 정의한 인터페이스이다. 여러단계에 걸쳐 복잡한 개체의 각 부분을 어떻게 생성할지 대한 세부사항을 포함한다. Concrete Builder : Builder 인터페이스를 구현하며, 구체적인 개체의 부품을 조립하는 방법과 최종 개체를 반환하는 메서드를 포함한다.  Director : Builder 인터페이스를 사용해 개체를 단계뼐로 생한다. Director는 어떤 순서로.. 2024. 5. 14.
추상 팩토리(Abstract Factory) - 생성 패턴(Creational Patterns) 추상 팩토리 패턴은 여러 관련 개체의 그룹, 서로 다르지만 특정 주제나 시나리오에 맞는 개체들을 생성하는 인터페이스를 제공하는 디자인 패턴이다. 이 패턴은 팩토리의 팩토리라고 표현할 수 있을 정도로 구체적인 클래스에 의존하지 않고 제품의 그룹을 생성할 수 있게 해 준다. 추상 팩토리의 구성은 팩토리 메서드 패턴과 비슷하다.  Abstract Factory  : 객체의 생성을 위한 인터페이스를 정의한다. 이 인터페이스는 여러 종류의 관련 있는 제품을 생성하는 메서드들을 포함한다. Concreate Factory : Abstract Factory 인터페이스를 구현하는 클래스이다. 특정 제품 그룹을 생성한다.Abstract Product : 생성될 제품들의 공통 인터페이스다.Concreate Product :.. 2024. 5. 14.
팩토리 메서드(Factory Method) - 생성 패턴(Creational Patterns) 팩토리 메서드 패턴은 객체 생성을 위한 인터페이스를 정의한다. 하지만 실제 객체 생성은 하위 클래스가 결정하도록 위임하는 생성 패턴이다. 이 패턴은 객체를 생성하는 코드와 해당 객체를 사용하는 코드를 분리함으로써 결합도를 낮추고, 유연성 및 확장성을 향상시킨다.Product (제품): 만들어질 객체들이 공통적으로 따라야 하는 인터페이스를 정의한다.Concrete Product (구체적인 제품): Product의 규칙을 실제로 구현한 객체이다.Creator (생성자): 객체를 만드는 방법을 선언하는 역할을 하며, "어떤 종류의 제품을 만들지"에 대해 추상적으로 정의한다. 실제 구현은 하위 클래스에서 이루어진다.Concrete Creator (구체적인 생성자): Creator가 정의한 메서드를 실제로 구현한.. 2024. 5. 13.
싱글톤(Singleton) - 생성 패턴(Creational Patterns) 가장 많이 사용하는 패턴 중 하나인 싱글톤 패턴은 특정 클래스의 인스턴스가 프로그램 전체에 하나만 존재하도록 보장하는 것이다. 싱글톤 패턴을 사용하면 동일한 개체를 여러 번 생성하지 않고 일관된 접근성을 제공할 수 있다. 클래스가 스스로 자신의 유일한 인스턴스를 관리하고 이에 대해서 전역 접근 지점을 제공하는데 주로 리소스를 공유하거나 구성을 설정하는 데 사용한다.  싱글턴에 대해 간단하게 예시로 설명하면 아파트 단지에 하나만 있는 관리사무소로 이해하면 쉬울 것 같다. 아파트단지에 공통적으로 사용하는 관리사무소는 단지 내에 유일하고, 아파트 주민들은 관리 사무소를 통해 다양한 서비스를 받는다. 이 때문에 아파트 주민들은 관리 사무소를 직접 만들거나 복제할 필요가 없고, 이미 존재하는 관리사무소를 이용하면.. 2024. 5. 10.
디자인 패턴이란 디자인 패턴이란 소프트웨어 설계 과정에서 자주 발생하는 문제들을 해결하기 위해 일반화된 재사용 가능한 솔루션을 제공하는 것이다. 특정 문제에 구체적인 코드를 제시하는 게 아니라 문제를 해결하는 방법의 템플릿을 제공하여 설계시간을 단축하고 코드의 재사용성을 높이는 것이다.  디자인 패턴은 90년대 초쯤에 등장했으며, 프로그래밍 초기에 개발자들이 비슷한 문제에 대해서 반복적으로 비슷하게 풀어가고 이를  표준화하고 체계화하여 개발자가 효율적으로 문제를 해결할 수 있도록 정의되었다  디자인 패턴을 학습하기 위해 정보를 찾다 보면 가장 먼저 GoF라는 단어를 볼 수 있는데 이는 Gang of Four의 약자인데 Erich Gammma, Richard Helm, Ralph Johnson, John Vlissides.. 2024. 5. 10.