Singleton Pattern

SingleTon Pattern (์‹ฑ๊ธ€ํ†ค ํŒจํ„ด)

Untitled
  • ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์˜ค์ง ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ์ƒ์„ฑ๋จ์„ ๋ณด์žฅํ•˜๋Š” ํŒจํ„ด

  • ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  Getter๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ํš๋“ํ•œ๋‹ค.

๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  • ์ƒ์„ฑ์ž๋ฅผ private์œผ๋กœ ์„ ์–ธํ•ด ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งˆ์Œ๋Œ€๋กœ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

  • ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ํด๋ž˜์Šค ์•ˆ์—์„œ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ private static ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•œ๋‹ค.

    ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    1. ํ•„์š”์„ฑ ์—ฌ๋ถ€์— ์ƒ๊ด€ ์—†์ด ๊ฐ์ฒด๋ฅผ ๋ฌด์กฐ๊ฑด ๋งŒ๋“ค์–ด ๋‘๋Š” ๊ฒฝ์šฐ

      public class MyClass {
      	private static MyClass singleInstance = new MyClass();
      
      	private MyClass () {} // private constructor
      
      	private static MyClass getMyClass() {
      		return singleInstance;
      	}
      }
    2. ์ฒ˜์Œ getter๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ

      public class MyClass {
      	private static MyClass singleInstance;
      
      	private MyClass () {} // private constructor
      
      	private static MyClass getMyClass() {
      		if (single == null) singleInstance = new MyClass();
      		return singleInstance;
      	}
      }

์žฅ์ 

  • ๋ฉ”๋ชจ๋ฆฌ ์ธก๋ฉด์—์„œ ์ด๋“์ด๋‹ค. ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ์ƒ์„ฑํ•ด ์ด๋ฅผ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•˜๋ฏ€๋กœ, ๊ณต์šฉ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ์— ์ข‹๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ’€(Pool) ๋˜ํ•œ ์ด๋Ÿฌํ•œ ์ด์ ์„ ์–ป๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฐœ๋…์ด๋‹ค.

๋ฌธ์ œ์ 

  • ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— getter์— ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ณด์™„์ฑ…์œผ๋กœ Double-Checked Locking Pattern (๋”๋ธ” ์ฒดํฌ ๋กœํ‚น ํŒจํ„ด)์ด ๋“ฑ์žฅํ–ˆ๋‹ค.

Double-Checked Locking Pattern (๋”๋ธ” ์ฒดํฌ ๋กœํ‚น ํŒจํ„ด)

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ฒ˜๋Ÿผ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด getter๋ฅผ ๋™๊ธฐํ™”(synchronized)ํ•˜๋Š” ๋ฐฉ๋ฒ•

public class MyClass {
	private static MyClass singleInstance;

	private MyClass () {} // private constructor

	private synchronized static void doSync() {
		// for sync
	}

	private static MyClass getMyClass() {
		if (single == null) {
			MyClass.doSync();
			singleInstance = new MyClass();
		}
		return singleInstance;
	}
}

Last updated