Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

Make your likes visible on Facebook?

Connect your Facebook account to Prezi and let your likes appear on your timeline.
You can change this under Settings & Account at any time.

No, thanks

G.o.F 디자인패턴

No description
by

dujin jeong

on 5 October 2012

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of G.o.F 디자인패턴

G.o.F Design Pattern 문제해결에 많이 사용되는 디자인 패턴 26가지 Creational Patterns Structural Patterns Behavioral Patterns 생성 패턴 구조 패턴 행동 패턴 Singleton Prototype Factory Method Builder Abstract Factory http://play.daumcorp.com/pages/viewpage.action?pageId=109002327 git@dgit.co:includex/GoFDesignPatternSample.git Bridge Composite Decorator Facade Flyweight Proxy Command Interator Mediator Memento Observer State Strategy Template Method Visitor 어떤 클래스의 인스턴스는 오직 하나임을 보장하며, 이 인스턴스에 접근할 수 있는 전역적인 접촉점을 제공하는 패턴 Singleton.getInstance(); private static Singleton instance;
private Singleton(){}

public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}

return instance;
} Code 활용 :
* 특정 값에 대한 전역적 접촉점이 필요할때
* 객체의 인스턴스가 하나임을 보장해야 할때

추가 :
* 사용시 생성됨(위치에 따라)

주의점 :
* 멀티 스래드
* 무분별한 전역변수화
* 생성시기 조절(명시적이지 않음) 인스턴스가 새 객체를 만들기 위해 자신을
복제하는 패턴 public Prototype clone(); In Java...

Class Prototype implements Cloneable{
...
}
Class Prototype1 extends prototype{
...
} Code 활용 :
* 클래스의 인스턴스들이 서로 다른 상태조합을 가질때
* 클래스로부터 인스턴스를 생성하기 어려운 경우
* 객체 생성 오버해드 제거가 필요한 경우
* 상태값들을 다양화해 객체를 사용할때

주의점 :
* clone이 불가능하다면 사용 할 수 없음(File Descriptor) 어떤 클래스의 객체를 생성할 지에 대한 결정을 서브클래스에게 위임하는 패턴 createProduct(type) public abstract class Factory {
public final Product op...(...) {
Product p = createProduct(...);
....(중요! 알고리즘)
return p;
}
protected abstract Product createProduct(...);
}


public class CardFactory extends Factory {
protected Product createProduct(...) {
...
}
} Code 활용 :
* 생성할 객체 타입을 예측할 수 없을 때
* 생성할 객체를 기술하는 책임을 서브클래스에게 정의하고자 할 때
* 알고리즘분리 시킬 수 있음

단점 :
* creator 클래스를 반드시 상속해 구체적 제품을 생성해야 한다(일반화 시키기 위해 계층을 생성시켜 수정이 어렵게될 수 있음) Adapter 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해 줌. 상속과 멤버변수를 통한 방법
class Adapter implements TargetInterface{
Adaptee adaptee = new Adaptee();
}

다중상속을 이용한 방법
class Adapter extends Adaptee implements TargetInterface Code 활용 :
* 기존 클래스를 사용해야 하지만, 인터페이스가 다른경우
* 이미 만들어진 것을 재사용하고자 하나 이 재사용 가능한 라이브러리를 수정할 수 없는 경우

고려할 점 :
* 개조를 위해 수행해야 하는 일의 정도

종류 :
* 다중상속을 이용한 패턴
* 목표 인터페이스를 상속하고, 기존 인터페이스객체를 멤버변수로 가지고 인터페이스 중재 서브시스템을 합성하는 다수 객체들의 인터페이스 집합에 대해 통합된 인터페이스를 제공하는 패턴 수정되지 않고(의도한 수정 제외) 반복적으로 사용되는 객체가 여러개 있을 때, 공유를 통해 이들을 효율적으로 사용할수 있도록 지원하는 패턴 객체들의 관계를 트리 구조로 구성하여 부분/전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 할 수 있는 패턴 요청을 객체의 형태로 캡슐화하여 서로 요청이 다른 사용자의 매개변수와, 요청 저장 또는 로깅, 그리고 연산의 취소를 지원하게 만드는 패턴 어떤 객체의 상태가 변할 때 그 객체에 의존성을 가진 가른 객체들이 그 변화를 통지받고 자동으로 갱신될 수 있게 만드는 패턴 public void attach(Observer){}
public void detach(Observer){}
public abstract void update(Observer);

//observer
public void notify(obj, ArrayList<Observer> callStack){} Code 활용 :
* 부분-집합 관계의 계층도를 표현해야 하고 복합 관계와 단일 객체 간의 사용을 동일하게 하고자 할 때(트리)

고려할 점 :
* 연결의 제약사항 - 예) HTML Div안 Div가 들어갈 수 없게 하려면?

appendChild를 private로
appendSpanElement, appendTextRunElement... 추가 활용 :
* 복잡한 서브시스템에 대한 단순한 인터페이스 제공이 필요할 때
* 클라이언트와 구현 클래스간에 너무 많은 종속성이 존재할 때

적용 :
* 서브시스템의 구성 요소 보호
* 서브시스템과 클라이언트 코드 간의 결합도를 낮춤 활용 :
* 애플리케이션이 대량의 객체를 사용해야 할 때
* 객체 수가 너무 많아져 저장 비용이 너무 높아질 때

주의점 :
* 객체를 식별자(ID, Handle)로 두는 경우 사용 할 수 없음
* 공유된 객체를 수정했을때 참조하고 있는 모든 곳에서 변경이 일어남

장점 :
* 공유해야 하는 인스턴스의 전체 수를 줄일 수 있음 * 수행할 행위 자체를 객체로 패러미터화하고자 할 때
* 서로 다른 시간에 요청을 명시하고, 저장하고, 수행할 수 있음. Command 객체는 요청과는 다른 생명주기 가짐
* 명령어 객체 자체에 실행 취소에 필요한 상태를 저장할 수 있음 활용 :
* 다른 객체에 변화를 통보할 때, 변화에 관심있어 하는 객체들이 누구인가에 대한 가정없이 이루어져야할 때
* Broadcast 방식의 교류를 가능하게 함

주의점 :
* 무엇이 어떤 것으로 부터 발생했는지 확인 하기 위해서 추가적인 작업(별도의 프로토콜)이 필요함
* 상호참조를 예방해야 함(Subject와 Observer) getFlyWeight(...) private HashMap<Character, PDFCharacter> fontTable;

public PDFCharacter getCharacter(char ch){
if(fontTable.get(ch) == null){
fontTable.put(ch, new PDFCharacter(fontFamily, ch));
}
return fontTable.get(ch);
} public abstract class Element {
...
}

public abstract class ContainerElement extends Element{
public void appendChild(Element oneChildElement);
public void removeChild(Element oneChildElement);
}

public abstract class LeafElement extends Element{
} Simple Factory public class SimpleFactory extends Factory {
protected Product createProduct(T type) {
Product product = null;
if(type == ...){
product = new ...(...);
}else if(type == ...){
product = new ...(...);
}
return product;
}
} ...Command extends BaseCommand class BaseCommand{
public abstract void execute();
public abstract void undo();
}

class PlusCommand extends BaseCommand{
public void execute(){
receiver.plus(5);
}

public void undo(){
receiver.minus(5);
}
} Abstarct Factory Pattern
Bridge Pattern
Builder Pattern
Chain of Responsibility Pattern
Decorator Pattern
Interpreter Pattern
Iterator Pattern
Mediator Pattern
Memento Pattern
Proxy Pattern
State Pattern
Template Method Pattern
Visitor Pattern
Strategy Pattern
Full transcript