디자인패턴 (singleton)

백종현·2023년 4월 28일
0
post-custom-banner

Singleton 패턴

클래스의 인스턴스가 단 하나만 필요한 경우 사용하는 패턴.

  • 지정된 클래스의 인스턴스가 1개밖에 존재하지 않음을 보증하고 싶을 때
  • 인스턴스가 1개밖에 존재하지 않는 것을 프로그램 상에서 표현하고 싶을 때
public class Main {
    public static void main(String[] args) {
        System.out.println("Start.");
        Singleton obj1 = Singleton.getInstance();
        Singleton obj2 = Singleton.getInstance();
        if (obj1 == obj2) {
            System.out.println("obj1과 obj2는 같은 인스턴스입니다.");
        } else {
            System.out.println("obj1과 obj2는 같은 인스턴스가 아닙니다.");
        }
        System.out.println("End.");
    }
}
public class Singleton {
    private static Singleton singleton = new Singleton();

    private Singleton() {
        System.out.println("인스턴스를 생성했습니다.");
    }

    public static Singleton getInstance() {
        return singleton;
    }
}

static 메소드를 통해 항상 처음 만들어진 같은 객체를 반환할 수 있도록 한다.

Singleton 패턴의 요소

Singleton의 역할 : Singleton 역할은 유일한 인스턴스를 얻기 위한 static 메소드를 가지고, 이를 통해 항상 같은 객체를 반환한다.

멀티 쓰레드에서의 Singleton 주의사항

public class Main {
	public static void main(String[] args) {

		MultiThread AAA = new MultiThread("AAA");
		MultiThread BBB = new MultiThread("BBB");

		AAA.start();
		BBB.start();

	}
}
public class MultiThread extends Thread{

	private String name;

	public MultiThread(String name) {
		this.name = name;
	}

	public void run() {

		int count = 0;

		for(int i=0; i<5; i++) {
			count++;
			Singleton singleton = Singleton.getInstance();
			System.out.println(name+ "의"+ count+"번째 쓰레드의 singleton 객체  : " + singleton.toString());

			try {
				Thread.sleep(400);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}
public class Singleton {

	private Singleton() {}

	private static Singleton single = null;

	public static /*synchronized*/ Singleton getInstance() {

		if(single == null) {
			System.out.println("싱글톤 생성...");
			single = new Singleton();
		}

		return single;
	}

}

이 경우, 초반에 여러개의 싱글톤 객체가 생성될 수 있다. 따라서 synchronized를 통해 싱글톤 생성을 한번으로 막을 필요가 있다.

Singleton과 Static method 비교

  1. 싱글톤과 비교하여 static은 다형성을 사용할 수 없다. (interface 화 불가. 또한 상속도 불가능)
  2. static은 여러 객체를 만들도록 바꿀 수 없다.
  3. static 객체는 생성지점을 제어할 수 없다. 필요할 때 Lazy Loading이 가능하다.
  4. 스태틱 클래스는 Mocking이 불가능하거나 구현에 제한이 있어 테스트가 쉽지 않다.

싱글톤이 상태를 갖지않고 global access를 제공한다면 Static Class를 고려해볼만 하다.

참조 : https://thisisnew-storage.tistory.com/9
Java 언어로 배우는 디자인 패턴 입문

profile
노력하는 사람
post-custom-banner

0개의 댓글