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 생성자로 인해 자식클래스 생성 불가능

Updated:

Leave a comment