1) 클래스 구현과 객체 생성이 독립적 ( 결합이 느슨함 )
2) 클라이언트가 객체를 생성하는 클래스를 알 필요가 없음. ( 인터페이스, 메소드, 파라미터만 알면 됨)
3) 클라이언트가 코드를 수정 없이도, 다른 타입의 객체를 생성위한 클래스 추가가 쉬움.
4) 이미 존재하는 객체를 재사용할 수 있음.
(클라이언트가 직접 객체 생성하는 경우 항상 새 객체가 생성)
1) 심플 팩토리 패턴 : 인터페이스가 객체 생성 방법 노출없이 객체를 생성
2) 팩토리 메소드 패턴 : 인터페이스가 객체를 생성할 수 있게 해줌. 하지만 객체 생성을 위한 클래스를 결정하는 것을 서브클래스에 미룸
3) 추상 팩토리 패턴 : 추상 팩토리는 클래스를 노출하거나 지정하지 않고, 관련된 오브젝트를 만드는 인터페이스임. 이 패턴은 내부적으로 다른 객체를 생성하는 다른 팩토리의 객체를 제공
객체 생성을 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할 지는 서브클래스엥서 이루어지도록 생성의 책임을 미룸
예를 들어서 자동차 클래스의 생성을 런타임에서 이루어진다고 할 때, 자동차 클래스는 위임 생성자 메소드를 실행시켜, 클라이언트의 런타임 선택에 맞춰 Kia, 현대 와 같은 클래스를 통하여 자동차 객체를 생성하고, 이를 반환한다.
객체의 구체적인 클래스를 명시하지 않고서, 그 객체와 관련되거나 의존하는 그룹을 생성하는 인터페이스를 제공
객체 그룹을 생성하거나 의존적인 과계의 객체를 생성할 때, 객체 생성을 추상화 해주는 패턴
예를 들어서 컴퓨터 객체를 만든다 할 때, 컴퓨터 객체는 삼성이나 LG와 같은 회사가 만드므로 이를 삼성컴퓨터, LG컴퓨터로 생성을 해주어야 할 것이다. 여기서만 보면 이제 팩토리 메소드 패턴과 같지만, 여기서 추상 팩토리 패턴은 삼성과 LG컴퓨터 의 부품인 마우스,키보드,모니터 등도 각 자회사의 부품을 사용 할 것이다. 그렇기 때문에 삼성컴퓨터라는 클래스에 삼성마우스,삼성키보드,삼성모니터가 포함되어 캡슐화된 형태로 돼있는 것이 추상 팩토리 패턴인 것이다.
객체를 사용할 때, 다시 생성하지 않고 복사해서 사용하는 패턴
클론 메소드 : 객체를 만들고, 그 객체속에 데이터를 원하는 형태로 만들어주는 메소드 이다. 클론 메소드에 일반 데이터를 넘겨주면 원하는 객체가 생성됨
재사용 되는 객체를 clone하여 저장하고, 이를 이용하는 패턴이다.
db를 통해서 어떠한 데이터를 가져오는 일은 많은 비용을 발생하게 하는데, 하나의 객체에 db 데이터를 추가해주고 이를 프로토타입 패턴으로 생성해주면 그 이후에 다시 db데이터 내용을 불러오지 않고, db 내용이 저장된 객체를 통하여 db 데이터를 이용 할 수 있다.
목적 : 어떤 클래스 S의 인스턴스를 하나만 만들고 싶을 때, 어플리케이션 전체에 하나만 필요한 경우
패턴의 핵심
1) 클래스 S의 생성자를 private로 선언한다.
2) 클래스 안에 private로 정적 속성을 선언한다.
3) 클래스의 객체를 리턴하는 public 메소드를 만들어준다.
방법 : 인터페이스를 상속받아 구현하여 합성
독립적으로 개발될 클래스 라이브러리의 합성
구조화 패턴
1) 새로운 기능을 구현하기 위하여 객체를 구성하는 방식
2) 런타임에 객체 구조를 변경
3) 유연성, 확장성
목적 : 런타임에 객체의 기능을 추가하기 위하여 사용하는 패턴
패턴 요약 : 패키지의 기능을 제공할 수 있는 유일 수단인 인터페이스를 정의
ex) GUI설계 - 상속을 이용하면 융통성이 없어짐, 화면 구성 클래스와 추가기능들을 분리 하나의 화면구성 클래스에 여러 개의 기능들을 연결되도록 구성
주의 : 클래스들을 패키지로 구성할 필요는 없음, 하나 이상의 클래스들이 파사드를 위하여 사용될 수도 있음
기능을 겹겹이 쌓아서 거대한 하나를 만드는 패턴이다.
원하는 인터페이스를 추상클래스로 정의(target)
이를 상속하는 어댑터 클래스를 만들고, 이를 요구하는 기능을 가진 클래스 (adaptee)와 메시지를 교환하게 함
기존에 존재하는 클래스를 재사용하고 싶지만, 원하는 인터페이스와 맞지 않을 때
미리 정해져 있지 않은 클래스들과 상호작용할 수 있는 재사용 가능 클래스를 만드려는 경우
어댑터 패턴은 상속을 이용한 방법과 위임을 이용한 방법 두가지를 통해서 사용 할 수 있다. 먼저 상속을 이용한 방법은 기존에 이용하던 class에 request() 메소드를 작성하고 이 request메소드를 상속받는 Adapter 클래스와 재사용을 원하는 클래스를 implements 하여 클래스들을 통합하는 방법이 있고, 위임을 이용한 방법은 Target 클래스를 Adapter가 상속을 받고, 정적 속성으로 Adaptee 클래스를 가져와 Adaptee 객체를 통하여 Adaptee 메소드를 사용한다.
서브시스템 내부가 복잡하여 클라이언트 코드를 사용하기 힘들 때 사용
클래스 패키지에 인터페이스를 제공하기 위하여 사용
클래스들을 패키지로 구성할 필요는 없음
하나 이상의 클래스들이 퍼사드를 위하여 사용될 수도 있음
외부에서 호출한 기능을 내부의 다른 클래스에 위임 형태로 전달
외부 클라이언트에게는 내부의 복잡한 사정을 감춤
Airline 클래스를 퍼사드 패턴으로 정의
Client가 가장 중요한 질의나 예약 오퍼레이션에 접근할 수 있고, Airline 클래스를 제외한 다른 클래스에 접근할 수 없음
다만, 퍼사드 안에 있는 findFlight, makeBooking등을 통해 간접적으로 호출
시간이 많이 소요되는 불필요한 복잡한 객체를 생성하는 시간을 간단한 객체로 돌림
한 클래스 객체가 다른 클래스 객체에 속도에 영향을 미칠 때, 사용하는 패턴이다.
ex) 한 클래스 내에 다른 클래스를 이용하여 이미지를 가져오는데 이미지가 올라오는 시간이 꽤 걸림 ->> 이미지를 임시로 설정할 수 있는 것으로 먼저 대체하고 나중에 이미지를 업로드 한다.
특정 객체에 접근을 조절하기 위하여 대리자를 세움
필요할 때만 비싼 대가의 기능을 접근하도록 프로시를 사이에 둠
로딩하는데 시간이 많이 소모되는 큰 그림과 같은 객체를 사용하고자 할 때 -> 이미지 대신 심볼이나 대체물을 화면에 출력
네트워크 작업에서 네트워크 사용이 증가해 로딩이 느린 객체
사용자에게 권한이 제한된 객체의 접근을 허용하게 할 때