Flutter_Factory 싱글톤과 관련되어 설명

Jooni·2021년 1월 18일
0

패턴

목록 보기
1/1

https://dart.dev/guides/language/language-tour#factory-constructors

Factory constructors

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.

In the following example, the Logger factory constructor returns objects from a cache, and the Logger.fromJson factory constructor initializes a final variable from a JSON object.

새로운 인스턴스를 더 생성하지 않고 하나의 인스턴스를 생성해야 할 경우 팩토리 키워드를 사용해 구조체를 만드세요. 예를들어, 팩토리 구조체는 캐시로부터 인스턴스를 반환할 겁니다. 그게 아니면 하위유형의 인스턴스를 반환할 겁니다.(이건 무슨뜻인지 모르겠음)
또다른 팩토리 구조체의 사용법으로는 final변수를 로직을 이용해 초기화 하는 것입니다. 초기화 리스트에서 초기화하기 어려울 때.

인스턴스 하나만 생성하고 싶을 때 쓰는 생성자라는 뜻으로 보인다. -> 이것은 싱글턴 쓸 때 쓰라는 이야기로도 해석할 수 있을거 같다.

https://stackoverflow.com/questions/60133252/what-is-the-purpose-of-a-factory-method-in-flutter-dart

예제

class DBHelper{
  static final DbHelper _dbHelper = DbHelper._internal();

  DbHelper._internal();

  factory DbHelper() => _dbHelper;
  
  ...
}

이 코드는 DB만들 때 쓰던 코드와 유사하다.

방법해설

1. 인스턴스를 딱 한개만 생성할 수 있도록 클래스에 팩토리 생성자를 만든다.

factory DbHelper() => _dbHelper;
  • 이렇게 하면 DBHelper의 생성은 딱 1번만 이루어 질 수 있다.

2. 하나 밖에 생성할 수 없는 생성자를 외부에서 생성못하게 named constructor로 캡슐화하자

DbHelper._internal();
  • 내부에서만 생성될 수 있게 위와 같은 방법으로 생성자를 만들어 준다.
  • named constroctor 설명 : https://medium.com/jay-tillu/constructors-in-dart-4f972186c372
  • 아래와 같은 코드가 일반적인 생성자 캡슐화 코드임 자바에서는! 근데 다트에는 private 선언문이 없음.
private DBHelper(){ //자바일 경우 예시
 return _dbHelper;
}

3. 인스턴스를 하나만 생성하도록 한다.

static final DbHelper _dbHelper = DbHelper._internal();
  • 메모리 하나 설정해서 고정적으로 불러서 쓸 것이므로 static 인스턴스 선언
  • 캡슐화해서 외부로부터 속성들을 보호하기 위해 private 인스턴스 선언
  • 1번 과정에서 외부로부터 생성되는 것을 방지하지 못했기 때문에 final 로 런타임시 초기화 되도록 함.
  • 멀티스레드 이용시 새로운 싱글톤 인스턴스가 생성이 될 것을 방지하기 위해 static으로 메모리를 할당을 받자마자 인스턴스를 생성해 집어 넣기.
    (동기화를 쓰는 방법이 있으나 이것은 불필요한 오버헤드를 만들어 성능을 깎아 먹는다. DCL이라는 방법이 있는데 이부분은 어떻게 하는지 모르겠다.)
profile
이해가 안돼시거나 질문이 있으신 분들은 댓글로 남겨주세요. 성심성의껏 응하겠습니다!

0개의 댓글