Sagen wir, ich möchte eine Liste von Strings erstellen (was nicht der Fall des realen Szenarios ist, aber klingt einfacher zu erklären).Sollte eine Fabrik einen Konstruktor mit Parametern haben?
ich eine Schnittstelle für meine Liste von Strings Fabrik haben würde, die wie diese
public interface IStringsListFactory{
List<string> Create();
}
aussehen würden aber läßt eine meiner konkreten Fabrik sagen würde erfordern, diese Liste des Zeichenfolge aus einer Datei/Datenbank erhalten usw. ..
public class StringsListFromFile : IStringsListFactory{
private StreamReader _streamReader;
public StringsListFromFile(StreamReader sr) //StreamReader is just an example.
{
_streamReader = sr;
}
public List<string> Create(){
///recover the strings using my stream reader...
}
}
ich weiß, dass dieser Ansatz funktionieren würde, aber ich frage mich, ob es das Werk Muster passieren Parameter auf das Werk Konstruktor bricht so würde ich nicht meine Schnittstelle brechen. Gibt es Gegenstücke dazu? Gibt es eine andere Lösung, an die ich nicht gedacht habe? Stelle ich zu viele Fragen!?! (Ja, ich kenne die Antwort auf dieses!)
Warum macht meine Fabrik einen Status, da mein Mitglied in meiner Klasse eingeschlossen ist? Und gibt IEnumerable ein Leistungsbedenken zurück? – TopinFrassi
Mit meinem Design in Punkt 2 können Sie Ihre Klasse einmal instanziieren und dann einen anderen 'StreamReader' verwenden, ohne ein anderes Objekt derselben Klasse erstellen zu müssen. Es ist eine andere Geschichte, wenn dein injizierter "StreamReader" eine Art globaler Konfiguration ist. Aber es braucht ein anderes Design für bessere Leistung. – Fendy
Die Rückkehr von "IEnumerable" ist nur eine Angewohnheit, 'Programm zu einer Schnittstelle zu machen, statt Programm zur Implementierung '. Wenn die Schnittstelle "IEnumerable" zurückgibt, kann sie auch ein Array oder eine andere Sammlung wie "ObersvableCollection" zurückgeben. – Fendy