일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 명시적 타입 변환
- Recoil
- Render Queue
- 좋은 PR
- zustand
- useCallback
- helm-chart
- Headless 컴포넌트
- 클라이언트 상태 관리 라이브러리
- CS
- linux 배포판
- TypeScript
- jotai
- 프로세스
- 암묵적 타입 변환
- useLayoutEffect
- Custom Hook
- Redux Toolkit
- 타입 단언
- AJIT
- JavaScript
- react
- docker
- Sparkplug
- task queue
- prettier-plugin-tailwindcss
- Microtask Queue
- type assertion
- Compound Component
- 주니어개발자
- Today
- Total
구리
자바 디자인 패턴 : SingleTone 본문
SingleTone 패턴이란 ?
전역 변수를 사용하지 않고 객체를 하나만 생성하여(static), 생성 객체를 어디서든지 참조할 수 있도록 하는 패턴
클래스가 오직 하나의 인스턴스만을 유지하도록 하는 패턴으로 한번 만들어지면 getInstance()와 같은 함수 또는 메소드 호출을 통해 객체에 접근
SingleTone 패턴 설계시 주의사항
1. private 생성자
2. statcic 변수로 객체 생성
3. 객체의 getter 구현
정적 변수가 아닌 SingleTone 패턴을 사용하는 이유 ?
interface의 사용이나 lazy loading등 싱글톤으로 할 수 있는 것이 많기에 사용
싱글톤 패턴 예시
우리가 핸드폰을 사용할 때 다크모드로 설정해두면 어떤 페이지로 이동해도 다크모드 세팅은 유지된다.
이처럼 하나의 셋팅(객체)이 어떤 페이지에서도 유지가 되어야 할 때 (어디서 참조해도 같은 상태) 싱글톤 패턴을 사용한다
먼저 Settings 클래스를 생성한다
public class Settings {
private static Settings settings = null;
private Settings() {
}
public static Settings getSettings() {
if(settings == null) {
settings = new Settings();
}
return settings;
}
private boolean darkMode = false;
private int fontSize = 13;
public boolean getDarkMode() { return darkMode; }
public int getFontSize() { return fontSize; }
public void setDarkMode(boolean _darkMode) {
darkMode = _darkMode;
}
public void setFontSize(int _fontSize) {
fontSize = _fontSize;
}
}
만약 getSettings를 처음 호출한다면 settings 변수의 상태는 null값이기에 new 연산자를 사용해 새로운 Settings 객체를 생성하고 그게 아니라면 기존에 존재하는 객체를 반환한다.
핸드폰의 첫번째 화면 코드라고 가정하자
public class FirstPage {
private Settings settings = Settings.getSettings();
public void setAndPrintSettings() {
settings.setDarkMode(true);
settings.setFontSize(15);
System.out.println(settings.getDarkMode() + " " + settings.getFontSize());
}
}
다크모드의 초기 상태는 false였으나 첫번째 페이지에서 true로 변경하고 폰트도 13에서 15로 변경하였다
핸드폰의 두번째 화면 코드라고 가정하자
public class SecondPage {
private Settings settings = Settings.getSettings();
public void printSettings() {
System.out.println(settings.getDarkMode() + " " + settings.getFontSize());
}
}
현재 화면의 다크모드 상태와 폰트크기를 호출하는 메서드를 생성하였다
첫번째 화면과 두번째 화면의 다크모드 여부와 폰트크기를 Main 클래스에서 알아보겠다
public class Main {
public static void main(String[] args) {
new FirstPage().setAndPrintSettings();
new SecondPage().printSettings();
}
}
실행시 모든 화면에서 다크모드 여부와 폰트 크기가 동일한 것을 볼 수 있다
이유는 Settings 클래스의 static 멤버 변수인 settings는 컴파일시 메모리의 지정된 공간에 딱 하나만 존재하므로
인스턴스 변수(동적 요소)들과 대비되는 정적 요소 개념이다
따라서 화면을 많이 만들어도 셋팅에 대한 걱정은 하지 않아도 된다
출처 : 얄팍한 코딩사전
'Java' 카테고리의 다른 글
동기 비동기 방식(Asynchronous processing model) (0) | 2021.06.09 |
---|---|
자바 디자인 패턴 : Factory Method Pattern (0) | 2021.06.07 |
TIL_210401_네트워킹 (0) | 2021.04.04 |
TIL_210331_Thread (스레드) (0) | 2021.03.31 |
TIL_210330_Collection 인터페이스 (0) | 2021.03.30 |