웹사이트 검색

Java 디자인 패턴 - 예제 튜토리얼


소개

디자인 패턴은 소프트웨어 개발자들 사이에서 매우 인기가 있습니다. 디자인 패턴은 일반적인 소프트웨어 문제에 대한 잘 설명된 솔루션입니다.

디자인 패턴 사용의 이점 중 일부는 다음과 같습니다.

  1. 디자인 패턴은 이미 정의되어 있으며 반복되는 문제를 해결하기 위한 업계 표준 접근 방식을 제공하므로 디자인 패턴을 현명하게 사용하면 시간이 절약됩니다. Java 기반 프로젝트에서 사용할 수 있는 많은 Java 디자인 패턴이 있습니다.
  2. 디자인 패턴을 사용하면 재사용 가능성이 향상되어 보다 강력하고 유지 관리가 용이한 코드를 얻을 수 있습니다. 소프트웨어 제품의 총 소유 비용(TCO)을 줄이는 데 도움이 됩니다.
  3. 디자인 패턴이 이미 정의되어 있기 때문에 코드를 쉽게 이해하고 디버그할 수 있습니다. 개발 속도가 빨라지고 팀의 새로운 구성원이 쉽게 이해할 수 있습니다.

Java 디자인 패턴은 창조, 구조동작 디자인 패턴의 세 가지 범주로 나뉩니다.

이 기사는 모든 Java 디자인 패턴 기사의 색인 역할을 합니다.

창조적인 디자인 패턴

생성 디자인 패턴은 특정 상황에 가장 적합한 방법으로 객체를 인스턴스화하는 솔루션을 제공합니다.

1. 싱글톤 패턴

싱글톤 패턴은 Class의 인스턴스화를 제한하고 JVM(Java Virtual Machine)에 클래스 인스턴스가 하나만 존재하도록 합니다. 싱글톤 패턴의 구현은 항상 개발자들 사이에서 논란이 되는 주제였습니다.

참고: 싱글톤 디자인 패턴에 대해 자세히 알아보세요.

2. 공장 패턴

팩토리 디자인 패턴은 여러 하위 클래스가 있는 상위 클래스가 있고 입력에 따라 하위 클래스 중 하나를 반환해야 하는 경우에 사용됩니다. 이 패턴은 클라이언트 프로그램에서 팩토리 클래스로 Class를 인스턴스화하는 책임을 집니다. 팩토리 클래스에 싱글톤 패턴을 적용하거나 팩토리 메서드를 정적으로 만들 수 있습니다.

참고: 공장 디자인 패턴에 대해 자세히 알아보세요.

3. 추상 공장 패턴

추상 팩토리 패턴은 팩토리 패턴과 유사하며 팩토리 중의 팩토리입니다. Java의 팩토리 디자인 패턴에 익숙하다면 제공된 입력에 따라 다른 하위 클래스를 반환하는 단일 팩토리 클래스가 있고 팩토리 클래스가 if-else 또는 switch 문을 사용하십시오. 추상 팩토리 패턴에서 우리는 if-else 블록을 제거하고 각 하위 클래스에 대한 팩토리 클래스와 입력 팩토리 클래스를 기반으로 하위 클래스를 반환하는 추상 팩토리 클래스를 갖습니다.

참고: 추상 팩터리 패턴에 대해 자세히 알아보세요.

4. 빌더 패턴

빌더 패턴은 개체에 속성이 많이 포함되어 있을 때 팩토리 및 추상 팩토리 디자인 패턴의 일부 문제를 해결하기 위해 도입되었습니다. 이 패턴은 객체를 단계별로 빌드하는 방법을 제공하고 실제로 최종 객체를 반환하는 메서드를 제공하여 다수의 선택적 매개 변수와 일관성 없는 상태로 문제를 해결합니다.

참고: 빌더 패턴에 대해 자세히 알아보세요.

5. 프로토타입 패턴

프로토타입 패턴은 객체 생성에 비용이 많이 들고 많은 시간과 리소스가 필요하며 유사한 객체가 이미 존재하는 경우에 사용됩니다. 따라서 이 패턴은 원본 Object를 새 Object로 복사한 다음 필요에 따라 수정하는 메커니즘을 제공합니다. 이 패턴은 Java 복제를 사용하여 객체를 복사합니다. 프로토타입 디자인 패턴은 복사하려는 객체가 복사 기능을 제공하도록 요구합니다. 다른 클래스에서 수행해서는 안 됩니다. 그러나 개체 속성의 얕은 복사 또는 깊은 복사를 사용할지 여부는 요구 사항에 따라 다르며 설계 결정입니다.

참고: 프로토타입 패턴에 대해 자세히 알아보세요.

구조 디자인 패턴

구조 디자인 패턴은 Class 구조를 만드는 다양한 방법을 제공합니다(예: 작은 객체에서 큰 객체를 만들기 위해 상속 및 구성 사용). .

1. 어댑터 패턴

어댑터 디자인 패턴은 구조적 디자인 패턴 중 하나로 관련 없는 두 개의 인터페이스가 함께 작동할 수 있도록 사용됩니다. 이러한 관련 없는 인터페이스를 연결하는 개체를 어댑터라고 합니다.

참고: 어댑터 패턴에 대해 자세히 알아보십시오.

2. 복합 패턴

복합 패턴은 부분-전체 계층 구조를 나타내야 할 때 사용됩니다. 구조의 객체가 동일한 방식으로 처리되어야 하는 방식으로 구조를 생성해야 하는 경우 복합 디자인 패턴을 적용할 수 있습니다.

참고: 복합 패턴에 대해 자세히 알아보십시오.

3. 프록시 패턴

프록시 패턴은 다른 객체에 대한 액세스를 제어하기 위한 자리 표시자를 제공합니다. 이 패턴은 기능에 대한 제어된 액세스를 제공하려는 경우에 사용됩니다.

참고: 프록시 패턴에 대해 자세히 알아보세요.

4. 플라이급 패턴

플라이웨이트 디자인 패턴은 Class의 많은 객체를 생성해야 할 때 사용됩니다. 모든 객체는 메모리가 부족한 장치(예: 모바일 장치 또는 임베디드 시스템)에 중요할 수 있는 메모리 공간을 사용하므로 플라이웨이트 디자인 패턴을 적용하여 를 공유하여 메모리 부하를 줄일 수 있습니다. 객체.

Java의 문자열 풀 구현은 플라이웨이트 패턴 구현의 가장 좋은 예 중 하나입니다.

참고: 플라이웨이트 패턴에 대해 자세히 알아보십시오.

5. 파사드 패턴

파사드 패턴은 클라이언트 애플리케이션이 시스템과 쉽게 상호작용하도록 돕는 데 사용됩니다.

참고: 파사드 패턴에 대해 자세히 알아보세요.

6. 브리지 패턴

인터페이스와 구현 모두에 인터페이스 계층이 있는 경우 브리지 디자인 패턴을 사용하여 구현에서 인터페이스를 분리하고 클라이언트 프로그램에서 구현 세부 정보를 숨깁니다. 브리지 디자인 패턴의 구현은 상속보다 구성을 선호한다는 개념을 따릅니다.

참고: 브리지 패턴에 대해 자세히 알아보십시오.

7. 데코레이터 패턴

데코레이터 디자인 패턴은 런타임에 개체의 기능을 수정하는 데 사용됩니다. 동시에 동일한 클래스의 다른 인스턴스는 이에 의해 영향을 받지 않으므로 개별 개체가 수정된 동작을 얻습니다. 데코레이터 디자인 패턴은 구조적 디자인 패턴(어댑터 패턴, 브릿지 패턴, 복합 패턴 등) 중 하나로 추상 클래스나 컴포지션과의 인터페이스를 사용하여 구현합니다. 객체의 동작을 확장하기 위해 상속이나 구성을 사용하지만 이것은 컴파일 타임에 수행되며 클래스의 모든 인스턴스에 적용할 수 있습니다. 런타임에 기존 동작을 제거하기 위해 새로운 기능을 추가할 수 없습니다. 이때 데코레이터 패턴이 유용합니다.

참고: 데코레이터 패턴에 대해 자세히 알아보세요.

행동 디자인 패턴

동작 패턴은 개체 간의 더 나은 상호 작용을 위한 솔루션과 쉽게 확장할 수 있는 느슨한 결합 및 유연성을 제공하는 방법을 제공합니다.

1. 템플릿 방식 패턴

템플릿 메서드 패턴은 동작 디자인 패턴이며 메서드 스텁을 만들고 일부 구현 단계를 하위 클래스로 연기하는 데 사용됩니다. 템플릿 메서드는 알고리즘을 실행하는 단계를 정의하고 모든 하위 클래스 또는 일부 하위 클래스에 공통일 수 있는 기본 구현을 제공할 수 있습니다.

참고: 템플릿 메서드 패턴에 대해 자세히 알아보세요.

2. 중재자 패턴

중재자 디자인 패턴은 시스템의 서로 다른 개체 간에 중앙 집중식 통신 매체를 제공하는 데 사용됩니다. 개체가 서로 직접 상호 작용하는 경우 시스템 구성 요소는 서로 밀접하게 결합되어 유지 관리 비용이 높아지고 쉽게 확장할 수 없습니다. 중재자 패턴은 통신을 위해 개체 간에 중재자를 제공하고 개체 간의 느슨한 결합을 구현하는 데 중점을 둡니다. 중재자는 개체 간의 라우터 역할을 하며 통신 방법을 제공하는 자체 논리를 가질 수 있습니다.

참고: 중재자 패턴에 대해 자세히 알아보세요.

3. 책임 사슬 패턴

책임 체인 패턴은 클라이언트의 요청이 객체 체인으로 전달되어 이를 처리하는 소프트웨어 설계에서 느슨한 연결을 달성하는 데 사용됩니다. 그런 다음 체인의 개체는 요청을 처리할 사람과 요청을 체인의 다음 개체로 보내야 하는지 여부를 결정합니다.

우리는 try-catch 블록 코드에 여러 catch 블록을 가질 수 있다는 것을 알고 있습니다. 여기서 모든 catch 블록은 특정 예외를 처리하는 일종의 프로세서입니다. 따라서 try 블록에서 예외가 발생하면 첫 번째 catch 블록으로 보내 처리합니다. catch 블록이 이를 처리할 수 없으면 요청을 체인의 다음 Object(즉, 다음 catch 블록)로 전달합니다. ). 마지막 catch 블록에서도 처리할 수 없는 경우 호출 프로그램에 대한 체인 외부에서 예외가 발생합니다.

참고: 책임 사슬 패턴에 대해 자세히 알아보십시오.

4. 관찰자 패턴

옵저버 디자인 패턴은 객체의 상태에 관심이 있고 변경 사항이 있을 때마다 알림을 받으려는 경우에 유용합니다. 옵저버 패턴에서 다른 Object의 상태를 감시하는 Object옵저버라고 하고, 제목이라고 합니다.

Java는 java.util.Observable 클래스 및 java.util.Observer 인터페이스를 통해 관찰자 패턴을 구현하기 위한 내장 플랫폼을 제공합니다. 그러나 구현이 제한되어 있고 대부분의 경우 Java가 클래스에서 다중 상속을 제공하지 않기 때문에 관찰자 패턴을 구현하기 위해 클래스를 확장하는 것을 원하지 않기 때문에 널리 사용되지 않습니다. JMS(Java Message Service)는 중재자 패턴과 함께 관찰자 패턴을 사용하여 응용 프로그램이 데이터를 구독하고 다른 응용 프로그램에 게시할 수 있도록 합니다.

참고: 관찰자 패턴에 대해 자세히 알아보세요.

5. 전략 패턴

전략 패턴은 특정 작업에 대해 여러 알고리즘이 있고 클라이언트가 런타임에 사용할 실제 구현을 결정할 때 사용됩니다. 전략 패턴은 정책 패턴이라고도 합니다. 우리는 여러 알고리즘을 정의하고 클라이언트 응용 프로그램이 매개 변수로 사용할 알고리즘을 전달하도록 합니다.

이 패턴의 가장 좋은 예 중 하나는 Comparator 매개변수를 사용하는 Collections.sort() 메서드입니다. 비교기 인터페이스의 다양한 구현을 기반으로 객체는 다양한 방식으로 정렬됩니다.

참고: 전략 패턴에 대해 자세히 알아보세요.

6. 커맨드 패턴

명령 패턴은 요청-응답 모델에서 느슨한 결합을 구현하는 데 사용됩니다. 이 패턴에서 요청은 invoker로 전송되고 호출자는 이를 캡슐화된 command 객체로 전달합니다. 명령 개체는 특정 작업을 수행하기 위해 요청을 수신자의 적절한 메서드로 전달합니다.

참고: 명령 패턴에 대해 자세히 알아보세요.

7. 상태 패턴

상태 디자인 패턴은 객체가 내부 상태에 따라 동작을 변경할 때 사용됩니다. 상태에 따라 객체의 동작을 변경해야 하는 경우 객체에 상태 변수를 두고 if-else를 사용할 수 있습니다. 상태에 따라 다른 작업을 수행하는 조건 블록입니다. 상태 패턴은 컨텍스트 및 상태 구현을 통해 이를 달성하기 위한 체계적이고 느슨하게 결합된 방법을 제공하는 데 사용됩니다.

참고: 상태 패턴에 대해 자세히 알아보세요.

8. 방문자 패턴

방문자 패턴은 유사한 종류의 개체 그룹에 대해 작업을 수행해야 할 때 사용됩니다. 방문자 패턴의 도움으로 개체에서 다른 클래스로 운영 논리를 이동할 수 있습니다.

참고: 방문자 패턴에 대해 자세히 알아보세요.

9. 통역사 패턴

인터프리터 패턴은 언어의 문법적 표현을 정의하는 데 사용되며 이 문법을 처리할 인터프리터를 제공합니다.

10. 반복자 패턴

반복자 패턴은 동작 패턴 중 하나이며 개체 그룹을 통과하는 표준 방법을 제공하는 데 사용됩니다. 반복자 패턴은 반복자 인터페이스가 Collection을 통과하는 방법을 제공하는 Java Collection Framework에서 널리 사용됩니다. 이 패턴은 요구 사항에 따라 다양한 종류의 반복자를 제공하는 데에도 사용됩니다. 반복자 패턴은 Collection을 통한 통과의 실제 구현을 숨기고 클라이언트 프로그램은 반복자 메서드를 사용합니다.

참고: 반복자 패턴에 대해 자세히 알아보세요.

11. 메멘토 패턴

memento 디자인 패턴은 나중에 복원할 수 있도록 개체의 상태를 저장하려는 경우에 사용됩니다. 이 패턴은 개체의 저장된 상태 데이터가 객체 외부에서 액세스할 수 없는 방식으로 이를 구현하는 데 사용되며, 이는 저장된 상태 데이터의 무결성을 보호합니다.

Memento 패턴은 originatorcaretaker라는 두 개의 객체로 구현됩니다. 발신자는 상태를 저장하고 복원해야 하는 객체이며 내부 클래스를 사용하여 객체의 상태를 저장합니다. 내부 클래스는 "Memento\라고 하며 다른 개체에서 액세스할 수 없도록 private입니다.

기타 디자인 패턴

Gang of Four 디자인 패턴에 속하지 않는 디자인 패턴이 많이 있습니다. 이러한 인기 있는 디자인 패턴 중 일부를 살펴보겠습니다.

1. DAO 디자인 패턴

DAO(Data Access Object) 디자인 패턴은 데이터 지속성 논리를 별도의 계층으로 분리하는 데 사용됩니다. DAO는 데이터베이스와 함께 작동하는 시스템을 설계할 때 매우 인기 있는 패턴입니다. 아이디어는 서비스 계층을 데이터 액세스 계층과 별도로 유지하는 것입니다. 이 방법으로 애플리케이션에서 로직 분리를 구현합니다.

참고: DAO 패턴에 대해 자세히 알아보세요.

2. 의존성 주입 패턴

종속성 주입 패턴을 사용하면 하드 코딩된 종속성을 제거하고 응용 프로그램을 느슨하게 결합하고 확장 가능하며 유지 관리할 수 있게 만들 수 있습니다. Java에서 종속성 주입을 구현하여 종속성 해결을 컴파일 타임에서 런타임으로 이동할 수 있습니다. 스프링 프레임워크는 종속성 주입 원칙에 따라 구축됩니다.

참고: 종속성 주입 패턴에 대해 자세히 알아보세요.

3. MVC 패턴

MVC(Model-View-Controller) 패턴은 웹 애플리케이션을 만들기 위한 가장 오래된 아키텍처 패턴 중 하나입니다.

결론

이 기사에서는 Java 디자인 패턴을 요약했습니다.

GitHub 리포지토리에서 Java 디자인 패턴 예제 코드를 확인할 수 있습니다.

더 많은 Java 자습서로 학습을 계속하십시오.