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๋ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์ถ์ง ์์ ๋ ์ฌ์ฉํ๋ ์์ฑ์์ด๋ค. ์ด์ ๊ฐ์ ๊ฐ๋
์ ์๋ก์ด ๊ฒ ์๋๋ค. ์ํํธ์จ์ด ๋์์ธ ํจํด ์ค '์ฑ๊ธํค ํจํด'์ ๋ฐ๋ฅธ ๊ฒ์ด๋ค.
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
๋ณต์ฌ

