/JAVA-Design-Pattern

개발에 도움이 되는 디자인 패턴

Primary LanguageJava

Design-Pattern

☀️디자인 패턴이란?

객체 지향 프로그래밍 설계를 할 때 자주 발생하는 문제들을 피하기 위해 사용되는 패턴

목차

  1. 생성 패턴 (Creational Pattern)
  2. 구조 패턴 (Structural Pattern)
  3. 행위 패턴 (Behavioral Pattern)

⭐️ 생성패턴 (Creational Pattern)

  • 객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공한다.

1. 추상팩토리(Abstract Factory)

  • 구제적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴

2. 팩토리 메서드(Factory Method)

  • 객체 생성 처리를 서브 클래스로 분리해 처리하도록 캡슐화하는 패턴

3. 빌더(Builder)

  • 복합 객체의 생성과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 함. 복잡한 객체의 단계별 생성

4. 프로토타입(Prototype)

  • 복사패턴. 인스턴스를 복사하여 새로운 객체 생성. clone(), copy()
  • 프로토타입 인스턴스를 이용해 생성할 객체의 종류를 명세하고 이 프로토타입을 복사해 새로운 객체 생성.

5. 싱글톤(Sigleton)

  • 단 하나의 인스턴스 (전역변수)
  • 오직 하나의 클래스 인스턴스만 만들어지도록 하고, 이에 대한 전역적인 접근을 제공. (Static method)

⭐️ 구조패턴 (Structural Pattern)

  • 서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나 객체들을 서로 묶어 새로운 기능을 제공하는 패턴이다.
  • 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하는지, 또 그렇게 하면서도 객체 사이의 결합도를 최소화하는 것에 중점을 둔다.

1. 어댑터(Adapter)

  • Adapter 패턴은 어떤 오브젝트를 캐스팅이 불가능한 다른 클래스의 형태로 변환시켜주는 것입니다.

2. 브리지(Bridge)

  • 추상화(또는 인터페이스)와 구현을 분리하여 각각을 독립적으로 변형 가능
  • 구현 자체도 하나의 추상화 개념으로 다양한 변형이 가능.
  • 구현과 독립적으로 인터페이스도 다양함을 가질 수 있다.

3. 컴포지트(Composite)

  • 여러 개의 객체들로 구성된 복합 객체와 단일 객체를 클라이언트에서 구별 없이 다루게 해주는 패턴

4. 데코레이터(Decorator)

  • 객체의 결합 을 통해 기능을 동적으로 유연하게 확장 할 수 있게 해주는 패턴

5. 파사드(Pacade)

  • 여러개의 메소드를 사용해 하나의 단순한 기능을 하는 인터페이스를 만드는 패턴.
  • 사용자로 하여금 좀더 객체의 여러 기능을 쉽게 이용할수 있도록 한다.

6. 플라이웨이트(Fly weight)

  • 객체의 내부에서 참조하는 객체를 직접 만드는 것이 아니라, 없다면 만들고, 만들어져 있다면 객체를 공유하는 식으로 객체를 구성하는 방법이다

7. 프록시(Proxy)

  • 어떤 객체를 사용하고자 할때, 객체를 직접적으로 참조 하는 것이 아니라, 그 객체를 대행(대리,proxy)하는 객체를 통해 대상객체에 접근하는 방식.
  • 이 방식을 사용하면 실제 대상 객체가 메모리에 존재하지 않아도 기본적인 정보를 참조하거나 설정할수 있고, 실제 객체의 기능이 반드시 필요한 시점까지 객체의 생성을 미룰 수 있다. 프록시 객체와 실제 객체는 같은 인터페이스를 구현하여, 프록시 객체는 실제 객체와 치환(맞바꿈)이 가능하다.

⭐️ 행위패턴 (Behavioral Pattern)

  • 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴
  • 한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하는지, 또 그렇게 하면서도 객체 사이의 결합도를 최소화하는 것에 중점을 둔다.

1. 책임체인(Chain of Responsibility)

  • 어떤 요청에 대해서 이를 처리하는 객체를 하나 혹은 여럿을 두어 해당 요쳥이 해결될때까지 연쇄 적으로 연결된 객체 핸들러 함수를 호출하는 방식

2. 커멘드(Commend)

  • 메소드 하나를 클래스로 분리 하는 방식

3. 인터프리터(Interpreter)

  • 문장을 해석할때 사용하는 패턴이다. 간단한 쉘커먼드 처리, 통신 프로토콜처리, 수식계산, 도메인 기반 언어(Domain Specific Language - SQL, XML, JSF등)의 해석에 주로 많이 쓰인다.

4. 반복자(Iterator)

  • 여러개의 원소를 가진 자료구조들(자바의 경우 Map,Set,List, array등)에 대해서 데이터 타입에 상관없이 각 원소에 접근할수 있는 패턴.
  • 자바의 경우 Map,Set,List등의 Collection Framework은 모두 Iterable interface를 상속한다.

5. 중재자(Mediator)

  • 서로 전혀 다른 객체간에 상호 통신이 매우 복잡할때 중재자를 통해 객체간의 통신을 가능하도록 캡슐화하는 방법

6. 메멘토(Memento)

  • 객체의 상태 정보를 저장하고 사용자의 필요에 의하여 원하는 시점의 데이터를 복원 할 수 있는 패턴.

7. 옵저버(Observer)

  • 주 객체의 변경이 일어날때마다 상태를 확인할수 있는 리스너 객체가 있다고 가정하고, 리스너 객체를 주객체에 등록하여 객체에 변경이 일어날때마다 리스너 객체의 함수가 불리게 되도록 하는 방식.

8. 상태(State)

  • 상태패턴은 주체 객체에게 여러개의 상태가 존재하고, 상태간에 긴밀한 연결성이 있을 경우에 상태간의 전이를 용이하게 해주는 패턴이다.

9. 전략(Strategy)

  • 일반적으로는 객체의 메소드에 대한 알고리즘이 미리 정해져있고, 정해진 알고리즘에 따라 어플리케이션 수행중에 그 메소드가 불리면 정해진 알고리즘이 불리게 된다.

10. 템플릿메소드(Template Method)

  • 어떤 알고리즘이 잘 구현된것이 있는데, 이것을 상황에 맞게 조금씩 다르게 확장해야 하는 경우에 유용한 패턴이다.

11. 방문자(Visitor)

  • 방문자 패턴은 여러 객체들에 대해 객체의 동작들을 지정하는 방식(N:N) 이다.