목차
• Singleton Pattern• Factory Pattern• Abstract Factory Pattern• Builder Pattern• Prototype Pattern
Singleton Pattern-1What's Sligleton?
• JVM 에서 오직 하나의 인스턴스만 존재 하도록 제한
• 매우 단순한 디자인 패턴• 다른 구현들과 많은 관계를 가짐 • logging, driver objects, caching, thread pool
등으로 주요 사용
Singleton Pattern-2How can make?
I. 생성자를 private으로 생성하여 다른 클래스에서 인스턴스 생성을 제한
II.해당 class를 private static 전역 변수로 선언 후 인스턴스를 생성하여 할당
III.public static method 를 통하여 전역 변수를 return
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 – 직렬화와 싱글톤
Eager initialization-빠른초기화-
I. 빠른 초기화는 클래스가 로드되는 순간 instance가 생성II. getInstance()를 호출 하면 해당 객체를 return
다만 객체 생성에 실패에 대한 처리를 제공 하지 않는다.
static block initalization-static block 초기화-
●빠른 초기화와 마찬가지로 클래스가 로드 되는 순간 instance가 생성 클래스 생성에 대한 예외 처리를 제공
Lazy initalization-늦은 초기화-
●늦은 초기화는 getInstance() method가 호출되는 순간 instance가 생성 후 해당 객체를 리턴
멀티 쓰레드 환경에서 만약 if 구문을 동시에 접근 하게 되면 두 쓰레드는 서로 다른 객체를 가질게 됨
Thread Safe Singleton-멀티 쓰레드에서 안전한 싱글톤-
●늦은 초기와 같이 getInstance() method가 호출되는 순간 instance가 생성 후 해당 객체를 리턴
멀티 쓰레드 환경에서도 안전하게 객체를 생성하기 위하여 동기화 구문을 이용
● 동기화 구문을 이용할 경우 성능에 안좋음
더블 체크 락킹 원칙을 이용한 오버해드 감소단! 더블체크 락킹은 JAVA 5 이상에서만 사용이 가능
참고 : http://blog.javarouka.me/2012/04/volatile-keyword-in-java.html
Bill Pugh Singleton-빌 퓨 싱글톤-
JDK 5.0 이하 버젼에서는 늦은 초기화 사용시, 두개 이상의 쓰레드가 동시에 Singleton 클래스에 인스턴스 요청 할 경우 서로 다른 객체를 할당 받을 수 있음
●빌 퓨는 내부 정적 도우미 클래스를 사용하여 싱글톤을 만드는 법을 제시 I. BillPugh 클래스가 로드 되어도 인스턴스는 생성 되지 않음II. getInstance가 호출되어야 SingletoneHeplper 클래스가 생성되어 BillPugh인스턴스를 생성
이 방법이 널리 사용되는 이유는 동기화(synchronization) 가 필요하지 않음
reflection to destroy singleton- reflection 을 이용한 싱글톤 파괴 -
● reflection을 이용하면 언제든 singleton 패턴을 파괴 할 수 있음● reflection 매우 강력 하며 spring, hibernate 등의 다수의 프레임워크에 사용
Enum Singleton-Enum 싱글톤-
● reflection에 대한 해결책으로는 enum을 이용하여 처리 ● enum은 java program에서 오직 하나의 객체만 존재●다만 늦은 초기화는 지원 하지 않음
Serialization and Singleton-직렬화와 싱글톤-
● 역직렬화시 동일한 객체의 리턴 해야함● readResolve 메소드를 오버라이드 하여 처리● 직렬화 & 역직렬화 참고 :
http://stackoverflow.com/questions/447898/what-is-object-serialization
Factory Pattern-1-What is Factory Pattern?-
• 생성 패턴 중 많이 사용 Spring이나 struts과 같은 프레임워크에도 사용 많이 사용 되어짐
• 슈퍼 클래스가 멀티 서브 클래스를 가지고 있고, 기본 입력으로 서브 클래스를 리턴할때 사용
• 이 패턴은 인스턴스 생성에 대한 책임을 팩토리 클래스에서 가짐
Factory Pattern-2- How can make?-
● Computer라는 슈퍼 클래스가 존재 ● Computer 클래스를 상속 받은
PC와 SERVER라는 서브 클래스가 존재 ●해당 서브 클래스 객체를 return 하는
ComputerFactory 에 대해 구현
Factory Pattern-3- How can make?-
Factory Pattern-4-Summary-
• 객체 생성을 관리하는 팩토리 클래스를 만들어서 중복을 최소화
• 추후 클래스 생성에 대한 관리를 한 곳에서 관리 가능
• 전체 설계가 추상화 클래스에 의존하게 되어 확장성과 유연성이 뛰어난 코드를 만들 수 있음
Abstract Factory Pattern-1- What is Abstract Factory Pattern?-
• 팩토리 패턴과 거의 흡사• 객체를 구성하는 부분을 추상화 하여 여러
서브 클래스가 상속/구현 받아서 객체를 구성하는 부분을 동일시 하는 방법
• 객체를 구성하는 클래스들이 있을때 구현 내용은 틀리지만 생성 공정이 같다면 그 부분을 추상화하여 사용 하는 것
Abstract Factory Pattern-2- How can make?-
Factory Pattern Class 와 동일Factory Pattern Class 와 동일
Abstract Factory Pattern-3- Summary -
• 팩토리 패턴에서 사용되는 if-else를 사용하지 않고 처리
• 소스 수정 없이 서브 클래스를 추가• 인터페이스를 이용하여 객체 생성에 대한
일관성을 유지
참고● 출처 :
http://www.journaldev.com/1827/java-design-patterns-example-tutorial#singleton-pattern
• GITHUB : https://github.com/lahuman/study4DesignPattern.git