단일스레드 환경 - 공통 로그 파일에 모든 사용자 계좌의 입금/출금의 발생 내역을 기록하는 프로젝트
설계
실행결과
2020-07-21 at 10:50:33 KST : owner : insang2 withdraw 5000
-> 문제: Insang1의 입금 내역이 누락
why?
위의 코드는 Account 인스턴스가 생성될 때 마다 새로운 Logger 인스턴스 생성
해결 방법 : 모든 Account 인스턴스가 하나의 Logger 인스턴스를 공유하도록 설계
Account 클래스와 Main 클래스 변경
위와 같이 변경 후 실행은 제대로 되지만 이 방법은 여러 Logger 인스턴스를 생성하지 못하게 하는 수단을 제공하지 못한다는 문제가 존재한다.
따라서 클래스가 아래 사진과 같이 하나의 인스턴스만을 가지도록 설계해야한다.
Eager Initialization
1. instance 선언시 static 변수 이용
2. 생성자를 private으로
3. Logger의 유일한 인스턴스를 생성 및 반환하는 getInstance() 메소드 정의
Account 클래스의 Logger를 Logger.getInstance()로 생성
위와 같이 설정한 후 실행을 해보면 제대로 출력이 되는 것을 확인할 수 있다.
실행은 제대로 되지만 이 방법은 클래스 로딩 시점에 초기화되어 인스턴스가 필요하지 않는 경우에도 생성된다는 문제점이 있다.
Lazy Initialization을 통해 인스턴스가 필요할 때 생성하는 법을 알아보자.
Lazy Initialization
아래와 같이 getinstance()를 변경해준다.
'아키텍처+디자인패턴' 카테고리의 다른 글
DIP (Dependency Inversion Principle) (2) | 2022.07.14 |
---|---|
ReactorKit Framework (0) | 2022.06.09 |
Delegate 패턴 (0) | 2022.02.09 |
MVC, MVVM (0) | 2021.11.13 |
다중 스레드 환경에서 싱글톤 패턴 : Synchronized / DCL(Double Checked Locking) / Demand(Lazy) Holder (0) | 2021.10.20 |