일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- java #Design Pattern #Prototype #디자인패턴 #프로토타입
- 플라이웨이 패턴
- java #spring #dbcp #connection pool #자바 #스프링
- flyweight pattern
- uuid
- 클래스 다이어그램 #UML
- java #spring # spring boot # 싱글톤 #prototype
- 아답터 패턴
- AdMob
- java #디자인패턴 #gof #추상 팩토리 패턴 #abstract
- 플러터
- Adapter Patten
- Postgre
- eclipse #pom.xml #
- Flutter
- 팩토리 메서트 # 패턴 #factory method # pattern
- Spring #Bean #객체생성시점
- java #디자인패턴 #Design Pattern #퍼사드 #Percade
- 애드몹
- java #자바 #디자인패턴 #싱글톤 #Singleton
- Bridge Patten
- java # 설계 #디자인패턴 # gof # 클래스 구조
- Default activity not found #build #에러
- mybatis
- tm4e
- Restful api #Spring boot #스프링부트
- 데코레이터 패턴
- timescale
- Builder Pattern #빌더 패턴 #디자인패턴 # Design Pattern #생성 패턴
- 브릿지 패턴
- Today
- Total
개발자의 무지개
싱글톤 패턴 (Singletone Pattern) 본문
개념
싱글톤 패턴은 생성 패턴 중 하나로써 객체가 단일 인스턴스를 가지도록 구현한다.
멀티쓰레드 환경에서 자원의 동시 접근을 막아 정합성을 보장하고, 리소스를 절약하는 용도로 사용된다.
구현방법
1. 생성자의 접근제한자를 private 으로 선언하여 직접 생성을 막는다.
2. static 멤버 변수를 만들어 인스턴스 생성 여부를 저장한다.
3. getInstance() 메서드를 public으로 만들어 인스턴스가 생성되지 않은 경우에 자신을 생성하여 리턴한다.
상황
프로그램 로그를 파일에 저장하는 기능이 필요하다. Log파일을 읽고 쓰는 LogController를 만들어 로그를 저장해보자.
코드 작성
package Singleton;
public class LogController {
private static LogController instance;
private String logFileContents;
private LogController() {
//log file을 디스크에서 읽어온다.
logFileContents = "Log file opened. \n";
}
public static LogController getInstance() {
if(instance == null) {
instance = new LogController();
}
return instance;
}
public void write(String newLog) {
//log file에 로그 내용을 저장한다.
logFileContents += newLog + "\n";
}
public void print() {
System.out.print(logFileContents);
}
}
LogController는 생성자가 private으로 선언되어 있으므로 직접 생성할 수 없다.
getInstance()를 호출하게 되면 instance가 생성되지 않은 경우 인스턴스를 생성하여 저장하고, 이미 생성되어 있는 경우 기존 인스턴스를 반환한다.
logFileContents는 실제로는 파일에 저장해야 하며 다른 쓰레드의 호출시 임계영역(Critical Section)에 진입하는 공유 영역이므로, 프로세스 동기화 기법을 이용하여 보호해야 한다.
여기서는 편의상 문자타입 변수로 간단히 작성하였다.
이제 getInstance() 를 호출하여 LogController의 인스턴스를 사용할 수 있다.
LogController logController1 = LogController.getInstance();
LogController logController2 = LogController.getInstance();
LogController logController3 = LogController.getInstance();
logController1.write("first log");
logController2.write("second log");
logController3.print();
getInstance 를 통해 단일 인스턴스가 반한되기에 logController1, logController2, logController3은 같은 인스턴스가 된다.
실행결과는 아래와 같다.
'소프트웨어 아키텍처 > 디자인패턴' 카테고리의 다른 글
클래스 다이어그램 UML 표기 설명 (0) | 2022.07.13 |
---|---|
퍼사드 패턴 (Facade Patten) (0) | 2022.07.10 |
프로토타입 패턴 (Prototype Pattern) (0) | 2022.07.09 |
빌더 패턴 (Builder Pattern) (0) | 2022.07.08 |
추상 팩토리 패턴 (Abstract Factory Pattern) (0) | 2022.07.07 |