구리

자바 디자인 패턴 : SingleTone 본문

Java

자바 디자인 패턴 : SingleTone

guriguriguri 2021. 4. 29. 00:05

SingleTone 패턴이란 ?

전역 변수를 사용하지 않고 객체를 하나만 생성하여(static), 생성 객체를 어디서든지 참조할 수 있도록 하는 패턴

클래스가 오직 하나의 인스턴스만을 유지하도록 하는 패턴으로 한번 만들어지면 getInstance()와 같은 함수 또는 메소드 호출을 통해 객체에 접근

이미지출처 :  en.wikipedia.org/wiki/Singleton_pattern

 

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는 컴파일시 메모리의 지정된 공간에 딱 하나만 존재하므로 

인스턴스 변수(동적 요소)들과 대비되는 정적 요소 개념이다 

따라서 화면을 많이 만들어도 셋팅에 대한 걱정은 하지 않아도 된다

 

출처 : 얄팍한 코딩사전