Use the factory keyword when implementing a constructor that doesn’t always create a new instance of its class. For example, a factory constructor might return an instance from a cache, or it might return an instance of a subtype. Another use case for factory constructors is initializing a final variable using logic that can’t be handled in the initializer list.
-> factory키워드는 클래스의 새로운 인스턴스를 항상 생성하지 않는 생성자를 실행할 때 사용하세요. 예를들면, factory 생성자는 캐시에서 인스턴스를 반환하거나, subtype의 인스턴스를 반환할 수 있습니다. factory 생성자의 다른 사용법은 initializer 리스트에서 처리할 수 없는 로직을 사용하여 final 변수를 초기화 하는 것입니다.
In software engineering, the singleton pattern is a software design pattern that restricts the instantiation of a class to one “single” instance. This is useful when exactly one object is needed to coordinate actions across the system. The term comes from the mathematical concept of a singleton.
-> Software Engineering에서, 싱글톤 패턴은 클래스의 인스턴스화를 하나의 "단일" 인스턴스로 제한하는 소프트웨어 디자인 패턴입니다. 시스템 전체에서 작업을 조정하는데 정확히 하나의 object가 필요할 때 유용합니다. 이 용어는 싱글톤의 수학적 컨셉에서 비롯됩니다.
class Singleton{
static final Singleton _instance = Singleton._internal();
factory Singleton(){
return _instance;
}
Singleton._internal(){ // 클래스가 최초 생성될 때, 1회 발생
// 초기화 코드
}
}
class Me{
static final Me _instance = Me._internal();
static final String _name = "ssorry_choi";
factory Me(){
return _instance;
}
static String get name => _name;
Me._internal(){ // 클래스가 최초 생성될 때, 1회 발생
// 초기화 코드
}
}
void main() {
var jacob = Me();
var choi = Me();
if(jacob == choi){
print('Same Person!');
}else{
print('Different Person!');
}
}
result : 'Same Person!'
class Singleton{
static final Singleton _instance = Singleton._internal();
int count=0;
factory Singleton(){
return _instance;
}
Singleton._internal(){
//초기화 코드
print('Created Singleton Class!');
count = 0;
}
}
class Normal{
int count=0;
Normal(){
// 초기화 코드
print('Created Normal Class!');
count = 0;
}
}
void main() {
var normalOne = Normal(); //첫번째 일반 클래스 생성
var normalTwo = Normal(); //두번째 일반 클래스 생성
var singleOne = Singleton(); //첫번째 싱글톤 클래스 생성
var singleTwo = Singleton(); //두번쨰 싱글톤 클래스 생성, But 이미 클래스가 생성되었기 때문에
//인스턴스만 넘겨주며, 초기화 코드가 실행되지 않는다.
print('singleton One: ${singleOne.count}, Two : ${singleTwo.count}');
print('normal One : ${normalOne.count}, Two : ${normalTwo.count}');
//각 클래스의 count 값 1씩 증가
normalOne.count++;
normalTwo.count++;
singleOne.count++;
singleTwo.count++;
print('\n\n===각 클래스 count값 1씩 증가 후===\n\n');
print('singleton One: ${singleOne.count}, Two : ${singleTwo.count}');
print('normal One : ${normalOne.count}, Two : ${normalTwo.count}');
}
Created Normal Class!
Created Normal Class!
Created Singleton Class!singleton One: 0, Two : 0
normal One : 0, Two : 0===각 클래스 count값 1씩 증가 후===
singleton One: 2, Two : 2
normal One : 1, Two : 1
일반 클래스는 2번 생성됐지만, Singleton 클래스는 한번만 초기화 코드가 돌아간 것을 볼 수 있다.