21
Design Pattern-2 Creational Design Pattern-1 임광규 ([email protected])

Desing Pattern-2

Embed Size (px)

Citation preview

Page 1: Desing Pattern-2

Design Pattern-2

Creational Design Pattern-1임광규

([email protected])

Page 2: Desing Pattern-2

목차

• Singleton Pattern• Factory Pattern• Abstract Factory Pattern• Builder Pattern• Prototype Pattern

Page 3: Desing Pattern-2

Singleton Pattern-1What's Sligleton?

• JVM 에서 오직 하나의 인스턴스만 존재 하도록 제한

• 매우 단순한 디자인 패턴• 다른 구현들과 많은 관계를 가짐 • logging, driver objects, caching, thread pool

등으로 주요 사용

Page 4: Desing Pattern-2

Singleton Pattern-2How can make?

I. 생성자를 private으로 생성하여 다른 클래스에서 인스턴스 생성을 제한

II.해당 class를 private static 전역 변수로 선언 후 인스턴스를 생성하여 할당

III.public static method 를 통하여 전역 변수를 return

Page 5: Desing Pattern-2

Singleton Pattern-3Implementation

• Eager initialization – 빠른 초기화• static block initialization – static block 초기화• Lazy initialization – 늦은 초기화• Thread Safe Singleton – Thread Safe 싱글톤• Bill Pugh Singleton Implementation

– Bill Pugh 싱글톤 구현• Using Reflection to destroy Singleton Pattern

– reflection 이용한 싱글톤 파괴• Enum Singleton – Enum 싱글톤• Serialization and Singleton – 직렬화와 싱글톤

Page 6: Desing Pattern-2

Eager initialization-빠른초기화-

I. 빠른 초기화는 클래스가 로드되는 순간 instance가 생성II. getInstance()를 호출 하면 해당 객체를 return

다만 객체 생성에 실패에 대한 처리를 제공 하지 않는다.

Page 7: Desing Pattern-2

static block initalization-static block 초기화-

●빠른 초기화와 마찬가지로 클래스가 로드 되는 순간 instance가 생성 클래스 생성에 대한 예외 처리를 제공

Page 8: Desing Pattern-2

Lazy initalization-늦은 초기화-

●늦은 초기화는 getInstance() method가 호출되는 순간 instance가 생성 후 해당 객체를 리턴

멀티 쓰레드 환경에서 만약 if 구문을 동시에 접근 하게 되면 두 쓰레드는 서로 다른 객체를 가질게 됨

Page 9: Desing Pattern-2

Thread Safe Singleton-멀티 쓰레드에서 안전한 싱글톤-

●늦은 초기와 같이 getInstance() method가 호출되는 순간 instance가 생성 후 해당 객체를 리턴

멀티 쓰레드 환경에서도 안전하게 객체를 생성하기 위하여 동기화 구문을 이용

● 동기화 구문을 이용할 경우 성능에 안좋음

더블 체크 락킹 원칙을 이용한 오버해드 감소단! 더블체크 락킹은 JAVA 5 이상에서만 사용이 가능

참고 : http://blog.javarouka.me/2012/04/volatile-keyword-in-java.html

Page 10: Desing Pattern-2

Bill Pugh Singleton-빌 퓨 싱글톤-

JDK 5.0 이하 버젼에서는 늦은 초기화 사용시, 두개 이상의 쓰레드가 동시에 Singleton 클래스에 인스턴스 요청 할 경우 서로 다른 객체를 할당 받을 수 있음

●빌 퓨는 내부 정적 도우미 클래스를 사용하여 싱글톤을 만드는 법을 제시 I. BillPugh 클래스가 로드 되어도 인스턴스는 생성 되지 않음II. getInstance가 호출되어야 SingletoneHeplper 클래스가 생성되어 BillPugh인스턴스를 생성

이 방법이 널리 사용되는 이유는 동기화(synchronization) 가 필요하지 않음

Page 11: Desing Pattern-2

reflection to destroy singleton- reflection 을 이용한 싱글톤 파괴 -

● reflection을 이용하면 언제든 singleton 패턴을 파괴 할 수 있음● reflection 매우 강력 하며 spring, hibernate 등의 다수의 프레임워크에 사용

Page 12: Desing Pattern-2

Enum Singleton-Enum 싱글톤-

● reflection에 대한 해결책으로는 enum을 이용하여 처리 ● enum은 java program에서 오직 하나의 객체만 존재●다만 늦은 초기화는 지원 하지 않음

Page 13: Desing Pattern-2

Serialization and Singleton-직렬화와 싱글톤-

● 역직렬화시 동일한 객체의 리턴 해야함● readResolve 메소드를 오버라이드 하여 처리● 직렬화 & 역직렬화 참고 :

http://stackoverflow.com/questions/447898/what-is-object-serialization

Page 14: Desing Pattern-2

Factory Pattern-1-What is Factory Pattern?-

• 생성 패턴 중 많이 사용 Spring이나 struts과 같은 프레임워크에도 사용 많이 사용 되어짐

• 슈퍼 클래스가 멀티 서브 클래스를 가지고 있고, 기본 입력으로 서브 클래스를 리턴할때 사용

• 이 패턴은 인스턴스 생성에 대한 책임을 팩토리 클래스에서 가짐

Page 15: Desing Pattern-2

Factory Pattern-2- How can make?-

● Computer라는 슈퍼 클래스가 존재 ● Computer 클래스를 상속 받은

PC와 SERVER라는 서브 클래스가 존재 ●해당 서브 클래스 객체를 return 하는

ComputerFactory 에 대해 구현

Page 16: Desing Pattern-2

Factory Pattern-3- How can make?-

Page 17: Desing Pattern-2

Factory Pattern-4-Summary-

• 객체 생성을 관리하는 팩토리 클래스를 만들어서 중복을 최소화

• 추후 클래스 생성에 대한 관리를 한 곳에서 관리 가능

• 전체 설계가 추상화 클래스에 의존하게 되어 확장성과 유연성이 뛰어난 코드를 만들 수 있음

Page 18: Desing Pattern-2

Abstract Factory Pattern-1- What is Abstract Factory Pattern?-

• 팩토리 패턴과 거의 흡사• 객체를 구성하는 부분을 추상화 하여 여러

서브 클래스가 상속/구현 받아서 객체를 구성하는 부분을 동일시 하는 방법

• 객체를 구성하는 클래스들이 있을때 구현 내용은 틀리지만 생성 공정이 같다면 그 부분을 추상화하여 사용 하는 것

Page 19: Desing Pattern-2

Abstract Factory Pattern-2- How can make?-

Factory Pattern Class 와 동일Factory Pattern Class 와 동일

Page 20: Desing Pattern-2

Abstract Factory Pattern-3- Summary -

• 팩토리 패턴에서 사용되는 if-else를 사용하지 않고 처리

• 소스 수정 없이 서브 클래스를 추가• 인터페이스를 이용하여 객체 생성에 대한

일관성을 유지

Page 21: Desing Pattern-2

참고● 출처 :

http://www.journaldev.com/1827/java-design-patterns-example-tutorial#singleton-pattern

• GITHUB : https://github.com/lahuman/study4DesignPattern.git