Search

[Dart] what is factory?

subtitle
singleton pattern class
Created
2021/02/25 11:59
tags
dart

what is factory?

flutter์—์„œ ๋ชจ๋ธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ์•„๋ž˜ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ factory๋ผ๋Š” ๊ฒƒ์„ dart์—์„œ ์ฒ˜์Œ ๋ดค๋‹ค. factory ํ‚ค์›Œ๋“œ๋Š” ๋ฌด์—‡์ด๊ณ  ์–ด๋–ค ์—ญํ• ์„ ํ• ๊นŒ?
class Book { final String title; final String description; Book({this.title, this.description}); factory Book.fromJson(Map<String, dynamic> json) { return Book( title: json['title'], description: json['description'], ); } }
Dart
๋ณต์‚ฌ

singleton pattern

๐ŸŒน
Use the factory keyword when implementing a constructor that doesnโ€™t always create a new instance of its class
dart ๋„ํ๋จผํŠธ์— ๋‚˜์˜ค๋Š” factory์— ๋Œ€ํ•œ ์„ค๋ช…์ด๋‹ค. ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ์ƒ์„ฑ์ž๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ factory ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ํ•œ๋‹ค.
factory๋Š” ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ƒ์„ฑ์ž์ด๋‹ค. ์ด์™€ ๊ฐ™์€ ๊ฐœ๋…์€ ์ƒˆ๋กœ์šด ๊ฒŒ ์•„๋‹ˆ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด ๋””์ž์ธ ํŒจํ„ด ์ค‘ '์‹ฑ๊ธ€ํ†ค ํŒจํ„ด'์„ ๋”ฐ๋ฅธ ๊ฒƒ์ด๋‹ค.
๐Ÿงšโ€โ™€๏ธ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด(singleton-pattern): ์†Œํ”„ํŠธ์›จ์–ด ๋””์ž์ธ ํŒจํ„ด์—์„œ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๋”ฐ๋ฅด๋Š” ํด๋ž˜์Šค๋Š”, ์ƒ์„ฑ์ž๊ฐ€ ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ํ˜ธ์ถœ๋˜๋”๋ผ๋„ ์‹ค์ œ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด๋Š” ํ•˜๋‚˜์ด๊ณ  ์ตœ์ดˆ ์ƒ์„ฑ ์ดํ›„์— ํ˜ธ์ถœ๋œ ์ƒ์„ฑ์ž๋Š” ์ตœ์ดˆ์˜ ์ƒ์„ฑ์ž๊ฐ€ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ์ด์™€ ๊ฐ™์€ ๋””์ž์ธ ์œ ํ˜•์„ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด๋ผ๊ณ  ํ•œ๋‹ค.

factory ํŠน์ง•

๋งค๋ฒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” (generative) constructor์™€ ๋‹ฌ๋ฆฌ factory์—๋Š” ๋ช‡ ๊ฐ€์ง€ ํŠน์ง•์ด ์žˆ๋‹ค.
โ€ข
๊ธฐ์กด์— ์ด๋ฏธ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด return ํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.
โ€ข
ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์—์„œ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ์ƒ์„ฑํ•œ๋‹ค(์‹ฑ๊ธ€ํ†ค ํŒจํ„ด).
โ€ข
์„œ๋ธŒ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฆฌํ„ดํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
โ€ข
Factory constructors ์—์„œ๋Š” this ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.
contructor๋ฅผ ์‚ฌ์šฉํ•œ ํด๋ž˜์Šค๋Š” ํ•ญ์ƒ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
class Book { final String title; final String description; Book({this.title, this.description}); } final book = Book(...); // ํ•ญ์ƒ ์ƒˆ๋กœ์šด Book ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
Dart
๋ณต์‚ฌ
factory๋Š” 'ํด๋ž˜์Šค์™€ ๊ฐ™์€ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค' ๋˜๋Š” '๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ธ์Šคํ„ด์Šค'๋ฅผ ๋ฆฌํ„ดํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋Š” ๊ธฐ์กด์— ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋˜๊ณ , ๊ธฐ์กด ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ธฐ์กด ๊ฒƒ์„ ๋ฆฌํ„ดํ•œ๋‹ค.
์•„๋ž˜ ์ฝ”๋“œ์—์„œ Logger()๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค Logger factory ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. ๋งŒ์•ฝ Logger('flutter')๋ฅผ ์ฒ˜์Œ ํ˜ธ์ถœํ•˜๋ฉด _cache์— ์—†์œผ๋‹ˆ Logger.internal('flutter') ์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค(1๋ฒˆ). ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋Š” _cache์— ์ €์žฅ๋œ๋‹ค(2๋ฒˆ). ํ•œ ๋ฒˆ ๋” ํ˜ธ์ถœํ•˜๋ฉด _cache์— ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ์œผ๋‹ˆ ๊ธฐ์กด ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
class Logger { final String name; bool mute = false; static final Map<String, Logger> _cache = <String, Logger>{}; // 1๋ฒˆ factory Logger(String name) { return _cache.putIfAbsent( // 2๋ฒˆ name, () => Logger._internal(name)); } factory Logger.fromJson(Map<String, Object> json) { return Logger(json['name'].toString()); } Logger._internal(this.name); void log(String msg) { if (!mute) print(msg); } }
Dart
๋ณต์‚ฌ
factory๋Š” ๊ณต์žฅ์ด๋ผ๋Š” ์ด๋ฆ„ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ณต์žฅ์ด๋ผ๊ณ  ์ฐฉ๊ฐํ•˜๊ธฐ ์‰ฝ๋‹ค. ์‚ฌ์‹ค์€ warehouse, ์ฐฝ๊ณ ์˜ ์˜๋ฏธ์™€ ๋” ๊ฐ€๊น๋‹ค.
factory๋Š” ์„œ๋ธŒํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ–ˆ๋‹ค. ์•„๋ž˜๋Š” Book ํด๋ž˜์Šค์˜ ์„œ๋ธŒํด๋ž˜์Šค์ธ ComicBook์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค. ์ถ”๊ฐ€๋กœ contructor์™€ factory๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ named ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
class Book { // named generative Book.comic(String title) : this(title, "Champ"); // named factory factory Book.comic(String title) { return ComicBook(title); } } class ComicBook extends Book { ComicBook(String title) : super(title, "Champ"); }
Dart
๋ณต์‚ฌ

references