2014-09-10 2 views
0

다트에서 팩토리 생성자는 코더에서 더 많은 로직을 필요로하지만 '비 최종'인스턴스 변수를 허용한다는 점을 제외하고는 const와 크게 다르지 않습니다.다트 팩토리 생성자 - "const"생성자와 다른 점

const 생성자에 비해 장점은 무엇입니까?

감사합니다.

아래

가 세스 래드의 블로그에서 공장 생성자에 대한 사용입니다 편집 - 공장 '생성자' '다트의 가치를 이해하려고 노력'.

class Symbol { 
    final String name; 
    static Map<String, Symbol> _cache = new Map<String, Symbol>(); 

    factory Symbol(String name) { 
    if (_cache.containsKey(name)) { 
     return _cache[name]; 
    } else { 
     final symbol = new Symbol._internal(name); 
     _cache[name] = symbol; 
     return symbol; 
    } 
    } 

    Symbol._internal(this.name); 
} 


main() { 
    var x = new Symbol('X'); 
    var alsoX = new Symbol('X'); 

    print(identical(x, alsoX)); // true 
} 

IMHO, 일반 생성자와 같은 효과는 미묘한 차이를 달성하지만, 매우 간단 할 수있다. 인쇄 (Symbol.cache) '에 도시 한 바와 같이 두 개의 인스턴스하는 & B는 서로 다른 객체 앞에서 설명한 것처럼

class Symbol { 
    static final Map<String, Symbol> cache = {}; 
    final String name; 

    Symbol(name) { 
    cache[name] = new Symbol._internal(); 
    } 

    Symbol._internal(); 
} 

main(){ 
var a = new Symbol('something'); 
var b = new Symbol('something'); 

print(identical(a, b)); // false! 
print(Symbol.cache); //{something: Instance of 'Symbol'} 
} 

, 효과는 모두 동일하다; // {something : 'Symbol'}의 인스턴스는지도 객체로 키와 동일한 문자열 중 하나만 허용합니다.

그래서, 내 질문은 공장 생성자 (또는 공장 패턴) 일반/const 생성자를 통해 특유의 장점은 무엇입니까? 위의 샘플 코드만으로는 팩토리 생성자의 장점이 나타나지 않으므로

누구나 'Factory Pattern'이 Java/C#이 아닌 다트 언어로 설명 될 수 있습니까?

+0

입니다. –

답변

5

팩토리 생성자와 const 생성자는 완전히 다른 목적을 수행합니다. const 생성자는 컴파일 타임 상수 표현식에서 사용자 정의 클래스의 인스턴스를 가질 수 있습니다. const 생성자에 대한 자세한 내용은 https://stackoverflow.com/a/21746692/217408을 참조하십시오.

팩토리 생성자와 클래스의 새 인스턴스를 반환하는 상수 메서드가 더 비슷합니다. 차이점은 factory 생성자는 일반 생성자와 마찬가지로 new으로 호출되며 상수 메소드에는없는 몇 가지 제한 사항이 있다는 점입니다.

일반 생성자와 팩토리 생성자의 가장 큰 차이점은 실제로 새 인스턴스가 만들어지고 구체적인 유형이 무엇인지에 영향을 미칠 수 있다는 것입니다.

https://www.dartlang.org/dart-tips/dart-tips-ep-11.html에는 인기있는 예로 캐시가 언급되어 있습니다. 팩토리 생성자는 준비된 재사용 가능한 인스턴스가 내부 캐시에 있는지 확인하고이 인스턴스를 반환하거나 그렇지 않으면 새 인스턴스를 만들 수 있습니다.

또 다른 예는 싱글 톤 패턴입니다. 자세한 내용은 https://stackoverflow.com/a/12649574/217408을 참조하십시오.

또 다른 예는 공장 패턴입니다. 예를 들어 팩토리 생성자에 전달 된 인수에 따라 A의 구체적인 하위 클래스 인스턴스를 반환하는 팩토리 생성자를 사용하여 추상 클래스 A (인스턴스화 할 수 없음)을 가질 수 있습니다.

여기에 완전히 같은 생성자를 사용하는 경우 동일한 인스턴스를 검색하는 심볼 클래스의 지점을 빠져 나가 예를 들어 같은 느낌이 비슷한 질문 Dart - Trying to understand the value of 'factory' constructor

관련 문제