๐Ÿ‹ Flutter

[Flutter] Factory๋ฅผ ํ†ตํ•œ Singleton ํŒจํ„ด

Dogfoot_JW 2024. 10. 5. 19:25

๊ฐœ์š”


์ผ๋ฐ˜์ ์ธ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” ์ƒ์„ฑ์ž ํ˜ธ์ถœ ์‹œ new ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

Flutter ๋„ ์ดˆ์ฐฝ๊ธฐ 1.x ๋ฒ„์ „ ๋‹น์‹œ์—๋งŒ ํ•ด๋„ ์–ด๋–ค ํด๋ž˜์Šค๋“  ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ new ํ‚ค์›Œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ถ™์˜€์–ด์•ผ ํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ Widget ๋“ค์€ class๋กœ ์„ ์–ธ๋˜์–ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— new ํ‚ค์›Œ๋“œ์˜ ์žฆ์€ ์‚ฌ์šฉ์œผ๋กœ ์ด๋ฅผ ๋ณด์™„ํ•˜๊ฒŒ ๋˜๋ฉด์„œ  new๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ƒ์„ฑ์ž ํ˜ธ์ถœ ์‹œ ์ž๋™์œผ๋กœ new ์ƒ๋žตํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. (์ผ๋ฐ˜ class๋„ ์ ์šฉ๋จ)

๊ทธ๋Ÿฌ๋‚˜ ๋งŒ์•ฝ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ฌด์ˆ˜ํžˆ ๋งŽ์ด ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๊ณผ๋„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

์ด๋•Œ ์‹ฑ๊ธ€ํ†คํŒจํ„ด์€ ๊ฐ์ฒด๋ฅผ ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ํŒจํ„ด์ด๋‹ค.

๋˜ํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‹ค์–‘ํ•œ ์˜์—ญ์— ๋™์ผํ•œ ์ƒํƒœ(state)๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด ์ค‘์— ํ•˜๋‚˜๋‹ค.

 

Singleton ํŒจํ„ด์˜ ๊ธฐ๋ณธ ๊ฐœ๋…


 

 

  • ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค: ํด๋ž˜์Šค๋Š” ์˜ค์ง ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ์„ ๊ฐ–๋Š”๋‹ค.
  • ์ „์—ญ ์ ‘๊ทผ: ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋Š” ์–ด๋””์„œ๋“  ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.
  • ์ง€์—ฐ ์ดˆ๊ธฐํ™”: ํ•„์š”ํ•  ๋•Œ๋งŒ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

 

 

Flutter์—์„œ Singleton ํŒจํ„ด ๊ตฌํ˜„


class TestSingleton {
  // Singleton ์ธ์Šคํ„ด์Šค๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜
  static final TestSingleton _instance = TestSingleton._internal();

  // private ์ƒ์„ฑ์ž
  TestSingleton._internal();

  // ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” factory ์ƒ์„ฑ์ž
  factory TestSingleton() {
    return _instance;
  }

  //์‹ฑ๊ธ€ํ†คํด๋ž˜์Šค์—์„œ ๊ด€๋ฆฌํ•  ์ƒํƒœ
  String data = "์‹ฑ๊ธ€ํ†ค ๋ฒ™๊ธ€ํ†ค!";
  
}

void main() {
  // ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  var singleton1 = TestSingleton();
  var singleton2 = TestSingleton();

  // ๋‘ ์ธ์Šคํ„ด์Šค๋Š” ๊ฐ™์€ ๊ฐ์ฒด์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  print(singleton1 == singleton2); // true
  print(singleton1.data); // ์‹ฑ๊ธ€ํ†ค ๋ฒ™๊ธ€ํ†ค!
  print(singleton2.data); // ์‹ฑ๊ธ€ํ†ค ๋ฒ™๊ธ€ํ†ค!
  
  singleton1.data = "์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค!";
  
  print(singleton1.data); // ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค!
  print(singleton2.data); // ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค!
  
}

 

  • TestSingleton._internal() ์€ private ์ƒ์„ฑ์ž์ด๋‹ค. ์™ธ๋ถ€์—์„œ๋Š” ์ ˆ๋Œ€๋กœ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ ์˜ค๋ฅด์ง€ ํ•ด๋‹น ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • factory TestSingleton() ์€ ์™ธ๋ถ€์—์„œ ์ด ํด๋ž˜์Šค์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋ฉฐ, ํ•ญ์ƒ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.
  • _instance๋Š” ์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ €์žฅํ•˜๊ฒŒ ๋  ๋ณ€์ˆ˜๋‹ค. ๋”ฐ๋ผ์„œ ํด๋ž˜์Šค๊ฐ€ ์ฒ˜์Œ ํ˜ธ์ถœ๋  ๋•Œ ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑ๋˜๊ณ , ๊ทธ ํ›„๋กœ๋Š” ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.
  • singleton1 == singleton2๋Š” ๊ฐ™์€ ์„œ๋กœ ๊ฐ์ฒด์ž„์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค.
  • singleton1.data = "์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค!"๋ฅผ ํ†ตํ•ด 1๋ฒˆ ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋จ์— ๋”ฐ๋ผ 2๋ฒˆ๋„ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.