[디자인 패턴][생성 패턴] 단일체 패턴(Singleton Pattern)
Updated:
1. 개요
클래스의 인스턴스가 하나임을 보장하고, 전역적으로 접근 가능하도록 접근점 제공
단일체 패턴(Singleton Pattern)은 생성 패턴(Creational Pattern)의 한 종류로, 클래스의 인스턴스가 오직 한 개만 존재하도록 하고, 해당 클래스의 인스턴스 접근 시 항상 동일한 인스턴스를 반환하도록 하는 패턴이다.
2. 생성 패턴(Creational Pattern)
2-1. 생성 패턴이란?
생성 패턴이란 인스턴스를 만드는 절차를 추상화하는 패턴으로, 객체를 생성, 합성하는 방법이나 객체의 표현 방법과 시스템을 분리해 준다. 생성 패턴은 아래 두 가지 특징으로 인해 무엇이, 어떻게, 언제 생성되는지 결정하는데 유연성을 확보할 수 있다.
-
시스템이 어떤 구체 클래스를 사용하는지에 대한 정보를 캡슐화 한다.
-
인스턴스들이 어떻게 만들고, 결합하는지에 대한 부분을 완전히 가려준다.
2-2. 생성 패턴 종류
3. 구성
[출처 : GoF의 디자인 패턴]
- Singleton : 하나의 인스턴스만을 생성하고, 항상 동일한 인스턴스 반환
4. 예제 코드
객체를 생성해주는 필드를 static final로 선언 후 객체를 생성하여 필드에 넣어놓고, 외부에서 해당 객체 생성시 기존에 생성한 객체를 반환해준다. 새로 생성하지 못하고 기존의 객체를 반환해 줄 수 있도록 생성자는 private으로 만들어야 한다.
4-1. Singleton
[UserService.java]
1
2
3
4
5
6
7
8
9
10
public class UserService {
private static final UserService instance = new UserService();
private UserService() {}
public static UserService getInstance() {
return instance;
}
}
Line 3 : static final로 필드 선언 후 객체 생성하여 초기화
Line 5 : 외부에서 직접 객체를 생성할 수 없도록 생성자를 private으로 선언
Line 7 ~ 9 : 해당 클래스의 객체 생성 시 항상 동일한 객체 반환
5. 테스트
[Clinet.java]
1
2
3
4
5
6
7
8
9
10
public class Client {
public static void main(String[] args) {
UserService userService1 = UserService.getInstance();
UserService userService2 = UserService.getInstance();
System.out.println(userService1);
System.out.println(userService2);
}
}
[실행 결과]
6. 특징
-
해당 객체에 대한 접근 제어 가능 : 항상 동일한 객체를 반환하므로 해당 객체에 대한 접근 제어 가능
-
메모리 절약 가능 : 반복적으로 객체를 생성하는 작업에 비해 메모리 절약 가능
-
상태 변경하지 않도록 통제 필요 : 하나의 객체를 공유하므로 상태를 변경해버리면 다른 클라이언트가 영향을 받을 수 있음
-
유연성이 떨어짐 : private 생성자로 인해 자식클래스 생성 불가능
Leave a comment