Factory Design Pattern - Warum-Schnittstelle notwendig?
Schaute ich mir die verschiedenen design-mustern, und jetzt konzentriere ich mich auf das Factory Design Pattern. Ich sah einige Beispiele, youtube-tuturials steht und blogs und ich habe die meisten aber habe ich noch nicht bekommen, warum eine Schnittstelle notwendig ist.
Die offizielle definition ist:
Definiert eine Schnittstelle zur Erstellung eines Objekts, aber lasse Unterklassen entscheiden
welche Klasse instanziiert werden soll. Factory Method ermöglicht einer Klasse zurückstellen
die Instanziierung in Unterklassen.
So eine Schnittstelle scheint ein wichtiger Teil der Factory Design Pattern, aber der einzige Grund, den ich fand wo seine praktische ist, wenn Sie eine Sammlung erstellen, in der main-Methode. Wenn Sie nicht wollen, dass, können Sie einfach löschen (Blick auf den code unten, wo das möglich ist) und es funktioniert immer noch wie geplant.
using System;
using System.Collections.Generic;
using System.Collections;
namespace FactoryDesignPattern
{
class Program
{
static void Main(string[] args)
{
var FordFiestaFactory = new FordFiestaFactory();
var FordFiesta = FordFiestaFactory.CreateCar("Blue");
Console.WriteLine("Brand: {0} \nModel: {1} \nColor: {2}", FordFiesta.Make, FordFiesta.Model, FordFiesta.Color);
Console.WriteLine();
//Inserted this later. Using a collection requires the Interface to be there.
List<ICreateCars> Cars = new List<ICreateCars>();
Cars.Add(new FordFiestaFactory());
Cars.Add(new BMWX5Factory());
foreach (var Car in Cars)
{
var ProductCar = Car.CreateCar("Red");
Console.WriteLine("Brand: {0} \nModel: {1} \nColor: {2}", ProductCar.Make, ProductCar.Model, ProductCar.Color);
Console.WriteLine();
}
Console.ReadKey();
}
}
public abstract class Car
{
public string Make { get; set; }
public string Model { get; set; }
public string EngineSize { get; set; }
public string Color { get; set; }
}
public class FordFiesta : Car
{
public FordFiesta()
{
Make = "Ford";
Model = "Fiesta";
EngineSize = "1.1";
}
}
public class BMWX5 : Car
{
public BMWX5()
{
Make = "BMW";
Model = "X5";
EngineSize = "2.1";
}
}
public interface ICreateCars
{
Car CreateCar(string color);
}
class FordFiestaFactory : ICreateCars
{
public Car CreateCar(string color)
{
return new FordFiesta() { Color = color };
}
}
class BMWX5Factory : ICreateCars
{
public Car CreateCar(string color)
{
return new BMWX5(){ Color = color };
}
}
}
Also, warum brauche ich das Interface? Ich lese mehrere abstrakte explenations aber ich habe nicht bekommen, so dass ich lieber praktische Antworten.
Vielen Dank im Voraus!
InformationsquelleAutor Hindrik | 2013-12-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Schnittstelle (oder abstrakte Fabrik, Basis-Klasse, die ist im wesentlichen dasselbe wie ein interface in-Effekt) ist immer dann nützlich, wenn der Anrufer von der Fabrik nicht wissen, die Art der Fabrik.
Sie die Basis für Ihre eigenen Praxisbeispiel, so werde ich meine Erklärung hier, warum das nicht nur nützlich, wenn man eine Liste von Fabriken:
Vorstellen, eine Methode, die angeblich ein Auto-wenn es angebracht ist, ohne zu wissen, welche Art von Auto zu erstellen (das ist, entscheidet die factory-Implementierung). Die Methode sieht eine
Person
- Objekt, das eineOwnsCar
Eigenschaft, und , dass Eigenschaft letztlich entscheidet, ob die factory-Methode aufgerufen werden soll:In der gleichen Weise, könnten Sie auch eine solche Fabrik zu erstellen, die eine beliebige Anzahl von Autos:
Beachten Sie, wie keiner der beiden Methoden weiß, was für ein Auto Typ ist; Sie benutzen, ein Werk von wen Sie kennen nur die Schnittstelle, nicht aber der genaue Typ.
Also, wenn Sie wollen in der Lage sein, verschiedene factory-Implementierungen, können Sie erklären, eine gemeinsame Schnittstelle für Ihre Fabriken. Wenn Ihre Fabrik nur dazu dient, halten Sie Ihre Anrufer Weg vom direkten Aufrufe des Ziel-Konstruktor, müssen Sie nicht die Fabrik-Schnittstelle.
InformationsquelleAutor O. R. Mapper
Können Sie immer wenden Sie ein design-Muster in der Weise, die Sie mögen. Es ist nichts falsch mit dem löschen einer Schnittstelle. Sie sollten jedoch berücksichtigen, dass das löschen der Schnittstelle führt zu einer weniger Allgemeinen Struktur.
Verwenden Sie die Fabrik-Muster, weil Sie nicht möchten, dass Ihre aufrufenden code (Haupt-Funktion) zu wissen, etwas über den Bau-details. Sie wollen nicht wissen, was ein FordFiest ist. Sie wollen einfach nur ein Auto im Allgemeinen gebaut werden. Wenn es einen Ford Fiesta, dann soll es so sein. Dieses detail ist etwas, das die Fabrik (und deren Unterklassen) behandeln soll. Richtig?
Wenn Sie nicht möchten, dass Ihr code ist abhängig von der jeweiligen Fabrik, müssen Sie eine zusätzliche Abstraktionsschicht, die durch die Schnittstelle, führt zu "Entkopplung" der beiden Teile. Wenn Sie nichts dagegen haben, Ihr code die Bindung an die spezifischen factory-Implementierung, können Sie immer entfernen Sie die Schnittstelle.
Hoffe, dass ich geholfen!
InformationsquelleAutor Pantelis Natsiavas
Sicher, dass Sie könnte verwenden
CarFactory
zu erstellen, die abgeleitete Fahrzeug-Klassen, aber dann jeder, der möchte, zur Unterstützung der Schaffung von Autos hat, eine Ableitung vonCarFactory
. Es scheint mir, dass der Zweck der Schnittstelle ist es, mehr Flexibilität bei den, der handeln kann, wie ein Auto Fabrik. Die Vorstellung ist, dass alle Sie tun müssen, um eineCarFactory
in diesem Beispiel ist die Umsetzung derICreateCars
- Schnittstelle. Keine Notwendigkeit zur Einführung der overhead der geliefertenCarFactory
Basisklasse.Ist der Schlüssel in der Entscheidung, was Ihr parameter-Typ wird auf Funktionen, an eine Auto-Fabrik. (oder, was das Mitglied für Mitglied, speichert eine
CarFactory
), Wenn SieICreateCars
, dann wer schaffen will Autos brauchen nur das interface implementieren. Wenn Ihre parameter-Typ istCarFactory
, dann müssten Sie Erben vonCarFactory
.InformationsquelleAutor BlueMonkMN
Naja, nicht wirklich - eine Schnittstelle ist nicht Bestandteil dieses Musters. Könnte man implementieren einer Fabrik ebenso gut wie eine statische Klasse oder auch eine normale.
Es ist nur so, dass die Verwendung von interfaces ist im Allgemeinen eine sehr gute Idee und die meisten guten, component-based designs machen starken Gebrauch von dieser. Es heißt Interface-basierte Programmierung, unter seiner Hauptvorteile ist, dass es ermöglicht für IoC-Container und, dass es macht Ihren code getestet.
Mich persönlich, ich benutze Schnittstellen fast blind, ohne auch nur darüber nachzudenken...
InformationsquelleAutor Thomas Weller
Zweck der Factory-Pattern ist die abstrakte Schöpfung. In diesem Fall gibt es die Möglichkeit exchange-Fabrik mit der richtigen Umsetzung.
Die Abstraktion implementiert werden kann durch interface oder abstrakte Klasse .NET.
Gebäude Ergebnis (
Car
) kann eine Klasse oder eine Schnittstelle, nur ein Blick auf die situation. Wie es zu bauen ist die Fabrik job.InformationsquelleAutor Artru
Schnittstellen lassen, dokumentieren Sie, dass es gibt eine Reihe von Klassen, die zu Ehren einer bestimmten Gruppe von polymorphen Methoden, ohne dass Sie eine Vererbungshierarchie für alle Klassen.
Ohne Schnittstellen der designer hätte eine künstliche Basis-Klasse, dass Sie alle geerbt. Dies wird unmöglich, wenn eine Klasse implementieren muss zwei verschiedene Sätze von polymorphen Methoden.
Mehrfache Vererbung ist etwas, das die Sprache, die Designer wollten vermeiden, da es unklar ist, welche Methoden aufgerufen werden soll, wenn eine Klasse zwei Eltern. Darüber hinaus, künstliche Vererbung von Implementierungen ist immer peinlich.
Grundsätzlich Schnittstellen lassen Sie Erben die Methode Definitionen ohne Erben Implementierung.
InformationsquelleAutor Caitliin Bestler