장군이네집
180219 디자인 패턴 1 본문
참고 블로그
http://jusungpark.tistory.com/
스트래티지 패턴
알고리즘군을 정의하고 캡슐화하여 교환해서 사용할 수 있도록 만드는 방식
위와 같이 공유하는/공유하지 않는(+변동가능한) 메소드가 공존하는 경우
1) 부모클래스에서 구현 : 사용할 수 없는 자식클래스에서도 사용가능
2) 인터페이스 상속 : 각 자식클래스에서 반복적으로 구현해야함
3) 중간 클래스 생성 : 확장성 부족
스트래티지 패턴은 "바뀌는 부분만 분리 시키는것"
부모클래스는 인터페이스를 상속하고 메소드를 호출하지만
메소드의 구현은 인터페이스를 상속한 클래스에서 하며,
자식 클래스에서 그 구상 클래스를 생성한다.
옵저버 패턴
한 객체(Observable)의 상태가 바뀌면, 그 객체에 의존하는 다른 객체들(Observer)에게 연락이 가고 자동으로 갱신되는 방식
Observable : Observable을 상속한 클래스를 만들고, 데이터 변동시 setChanged() / notifyObservers()
Observer : Observer를 implement하고 Observable에 addObserver를 통해 등록. update를 override하여 데이터 처리
Observable이 class이기 때문에 interface로 직접 구현할수 있음
http://hyeonstorage.tistory.com/166
데코레이터 패턴
객체에 추가적인 요건을 동적으로 첨가하는 방식.
서브클래스를 통해 기능을 유연하게 확장 가능.
Beverage의 cost함수를 decorator에 인자로 넣어주면서 beverage에 대한 인스턴스는 계속 지니고 있으며,
새로운 기능을 추가할수 있다.
싱글톤 패턴
해당 클래스의 인스턴스가 하나고, 어디서든지 그 인스턴스에 접근가능
if (instance == null){
instance = new Singleton():
}
멀티쓰레드 상황에서는 문제가 생길 수 있음
1) synchronized -> 성능이 매우 저하됨
2) instance를 미리 생성
3) DCL(double checking lock)을 통해 동기화 부분을 줄임
커맨드 패턴
요구사항을 객체로 캡슐화한다.
요청 내역을 큐에 저장, 로그, 작업취소 등이 가능하다.
1) interface Command를 상속한 class에서 execute를 구현한다.
2) Control객체 에서는 setCommand를 통해 command를 등록하고 execute를 호출할 메소드를 만든다.
3) Control객체를 확장하여 다중 command를 수행하고 관리 할 수있음
어댑터 패턴
한 클래스의 인터페이스를 클라이언트에서 사용가능하게끔 변환시켜주는 방식
Duck과 Turkey가 있을때,
Duck을 상속한 TurkeyAdapter를 생성하여, Duck의 기능을 Turkey의 기능으로서 수행할 수 있게끔 만든다.
@Override
public void quack(){
turkey.gobble();
}
퍼사드 패턴
서브시스템에 대한 통합된 고수준 인터페이스를 제공한다
템플릿 메소드 패턴
알고리즘의 골격을 정의한다 (말 그대로 메소드의 템플릿)
* 구성요소의 활용 시기는 고수준 구성요소에서 결정하고,
저수준 구성요소는 절대 고수준 구성요소를 직접 호출하지 않는다
컴포지트 패턴
객체를 트리구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있음
File과 Directory
Leaf(File)은 getName만
Composite(Directory)는 getName과 함께 Leaf의 list를 관리하는 기능을 포함한다.
한 클래스는 단일 역할을 맡아야 하지만,
컴포지트 패턴은 단일 역할 원칙을 깨면서 투명성을(?) 확보한다고 한다.
빌더 패턴
생성자의 매개변수가 많을때 사용하는 방식
*Javabeans 패턴은 getter / setter를 제공하는 클래스
빌더 패턴은
1) 생성자를 통해서는 필수 매개변수를
2) 다른 메소드를 통해서는 선택 매개변수를 설정하고
3) 불변의 객체를 반환한다
메멘토 패턴
객체 내에 객체의 상태를 저장하는 객체를 생성하고 복원하는 함수를 구현
메멘토 객체는 이를 포함하는 객체만 접근 가능하다
'개발 > Java' 카테고리의 다른 글
180112 스택, 힙 영역(stack & heap) (0) | 2018.01.13 |
---|