한 작업에서 여러 클래스를 생성하여 복잡한 작업을 해야할 때, 이 과정들을 외벽 뒤로 숨겨 추상화 할 때 사용. (이미 자주 사용해본 적이 있을 패턴)
어떤 같은 형식을 지닌 특정 작업들의 세부 방식을 다양화 하고자 할 때 사용.
어떤 일을 수행하는 몇가지 방법이 있는데 그 전반적 과정에 공통된 절차가 있을 때 코드를 효율적으로 짜기 위해 만들어진 패턴
부모 클래스에 전반 과정을 수행하는 메인 메소드가 있고, 그 과정 가운데 세부 메소드가 있음
자식 클래스는 과정을 수행하는 세부 메소드를 오버라이딩.
특정 클래스의 객체들이 할 수 있는 일을 여러가지 두고 각 객체마다 사용자가 원하는 대로 골라 시키거나 기능들을 필요에 따라 장착할 수 있도록 할 때 사용된다.
예: 게임에서 전투기가 아이템을 먹을 때마다 공격시 발사하는 무기들이 추가됨
객체가 생성자 변수로 다른 객체 안에 들어감으로써 그 실행하는 메소드의 행동이 추가되도록 한다.
팩토리 메소드 패턴은 클래스의 인스턴스를 만드는 일을 서브 클래스에게 맡기는 것이다. (생성자를 호출하는 클래스)
예: Component class를 상속하는 Button, Switch, Dropdown 클래스가 있을 때, new Button(), new Switch()와 같은 객체 생성 코드를 CompFactory class에 구현하여 CompFactory.getComp(컴포넌트 종류) 이런식으로 객체를 생성한다.
장점
팩토리 메소드 패턴에 한단계 더 추상화가 입혀진 패턴
특정 객체들을 찍어낼 공장인 팩토리도 여러 종류로 건설할 수 있도록 함
특정 이벤트에 반응해서 관련된 다른 클래스들에 알려주는 일을 mediator 중재자 역할을 하는 클래스에 전담시키는것
비유: 거래처에 전화를 돌릴 외주업체를 따로 두는 것
회사(N) - 중재자 (외주업체 1) - 거래처(N) : 중재자를 중심으로 회사와 거래처가 N:N관계가 될 수 있다
여러 클래스들의 관계가 특정 이벤트들을 중심으로 복잡하게 얽힌 설계에서 유용하게 사용
포함하는 것과 포함되는 것들이 같은 방식으로 다뤄질 수 있도록 할 때 컴포지트 패턴 사용
예: 컴퓨터의 폴더 시스템과 유사함. 폴더와 파일은 다른 종류이지만, 둘다 이름 바꾸기, 용량구하기, 삭제하기 등의 명령을 받을 수 있음