[英]Dart factory constructor - how is it different to “const” constructor
在Dart中,工廠構造函數需要來自編碼器的更多邏輯,但與const類型不同,除非它們允許“非最終”實例變量。
它們對const構造函數的優點是什么?
謝謝你們。
編輯
下面是關於Seth Ladd的博客'Dart - 試圖了解'工廠'構造函數'的價值的工廠構造函數的用法。
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
}
恕我直言,與一般的構造函數,可以實現相同的效果與微妙的差異,但相當簡單。
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'}
}
如上所示,雖然兩個實例a和b是不同的對象,但效果與'print(Symbol.cache); // {something:'Symbol'的實例}作為一個地圖對象,只允許其中一個相同的字符串作為其鍵。
所以,我的問題是工廠構造函數(或工廠模式)對一般/ const構造函數的特殊優點是什么? 因為上面的示例代碼沒有顯示工廠構造函數的優點。
任何人都可以解釋Dart語言中所謂的“工廠模式”而不是Java / C#嗎?
工廠構造函數和const構造函數實現完全不同的目的。 const構造函數允許在編譯時常量表達式中具有自定義類的實例。 有關const構造函數的更多詳細信息,請參見https://stackoverflow.com/a/21746692/217408 。
工廠構造函數和返回類的新實例的常量方法更相似。 不同之處在於,工廠構造函數與普通構造函數一樣使用new
調用,並且具有常量方法所沒有的一些限制。
普通構造函數和工廠構造函數之間的主要區別在於,您可以影響實際創建新實例以及它的具體類型。
在https://www.dartlang.org/dart-tips/dart-tips-ep-11.html中,提到緩存是一個流行的例子。 工廠構造函數可以檢查它是否在內部緩存中具有准備好的可重用實例並返回此實例或以其他方式創建新實例。
另一個例子是單身模式。 有關詳細信息,請參閱https://stackoverflow.com/a/12649574/217408 。
另一個例子是工廠模式。 例如,您可以使用工廠構造函數來獲取抽象類A
(無法實例化),該構造函數返回A
的具體子類的實例,具體取決於傳遞給工廠構造函數的參數。
這是一個類似的問題Dart - 試圖理解'factory'構造函數的價值
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.