Fabrieksmethode Ontwerppatroon
Intentie
- Definieer een interface voor het maken van een object, maar laat de subklassen beslissen welke klasse wordt geïnstantieerd. Factory Method laat een klasse uitstellen naar subklassen.
- Een “virtuele” constructor definiëren.
- De
new
operator wordt als schadelijk beschouwd.
Probleem
Een raamwerk moet het architectonisch model standaardiseren voor een reeks toepassingen, maar het moet individuele toepassingen toestaan om hun eigen domeinobjecten te definiëren en te voorzien in hun instantiatie.
Discussie
Fabrieksmethode is het maken van objecten als sjabloonmethode is het implementeren van een algoritme. Een superklasse specificeert al het standaard en algemeen gedrag (met gebruik van pure virtuele “tijdelijke aanduidingen” voor creatiestappen), en delegeert vervolgens de aanmaakdetails naar subklassen die door de klant worden geleverd.
Fabrieksmethode maakt een ontwerp meer aanpasbaar en slechts een klein beetje ingewikkelder. Andere ontwerppatronen vereisen nieuwe klassen, terwijl Factory Method alleen een nieuwe bewerking vereist.
Mensen gebruiken Factory Method vaak als de standaardmanier om objecten te maken, maar het is niet nodig als: de klasse die is geïnstantieerd nooit wijzigingen of instantiatie vindt plaats in een bewerking die subklassen gemakkelijk kunnen overschrijven (zoals een initialisatiebewerking).
Fabrieksmethode is vergelijkbaar met Abstract Factory maar zonder de benadrukkingsfamilies.
Fabrieksmethoden worden routinematig gespecificeerd door een architecturaal raamwerk, en vervolgens geïmplementeerd door de gebruiker van het raamwerk.
Structuur
De implementatie van de Fabrieksmethode besproken in de Gang of Four (hieronder) overlapt grotendeels met die van Abstract Factory. Om die reden concentreert de presentatie in dit hoofdstuk zich op de benadering die sindsdien populair is geworden.
Een steeds populairder wordende definitie van fabriek methode is: een static
methode van een klasse die een object van dat klasse “type retourneert. Maar in tegenstelling tot een constructor, kan het daadwerkelijke object dat het retourneert een instantie zijn van een subklasse. Unlikea constructor, een bestaand object kan worden hergebruikt in plaats van dat er een nieuw object wordt gemaakt. In tegenstelling tot een constructor, kunnen factory methodscan verschillende en meer beschrijvende namen hebben (bijv. Color.make_RGB_color(float red, float green, float blue)
en Color.make_HSB_color(float hue, float saturation, float brightness)
De client is volledig losgekoppeld van de implementatiedetails van afgeleide klassen. Polymorfe creatie is nu mogelijk.
Voorbeeld
De fabrieksmethode definieert een interface voor het maken van objecten, maar laten subklassen beslissen welke klassen ze willen instantiëren. Spuitgietpersen demonstreren dit patroon. Fabrikanten van plastic speelgoed verwerken plastic vormpoeder en injecteren het plastic in mallen met de gewenste vormen. De speelgoedklasse (auto, actiefiguur, etc.) wordt bepaald door de mal.
Checklijst
- Als je een overervingshiërarchie hebt die polymorfisme uitoefent, overweeg dan om een polymorfe creatievermogen toe te voegen door een
static
fabrieksmethode in de basisklasse te definiëren. - Ontwerp de argumenten voor de fabrieksmethode. Welke kwaliteiten of kenmerken zijn nodig en voldoende om de juiste afgeleide klasse te identificeren om te instantiëren?
- Overweeg om een interne “objectpool” te ontwerpen waarmee objecten kunnen worden hergebruikt in plaats van helemaal opnieuw te worden gemaakt.
- Overweeg alle constructors maken
private
ofprotected
.
Vuistregels
- Abstracte fabrieksklassen worden vaak geïmplementeerd met fabrieksmethoden, maar ze kunnen worden geïmplementeerd met behulp van prototype.
- Fabrieksmethoden worden meestal aangeroepen binnen sjabloonmethoden.
- Fabrieksmethode: creatie door overerving . Prototype: creatie via delegatie.
- Vaak beginnen ontwerpen met Factory Method (minder gecompliceerd, beter aanpasbaar, subklassen nemen toe) en evolueren naar AbstractFactory, Prototype of Builder (flexibeler, complexer) naarmate de ontwerper ontdekt waar meer flexibiliteit is nodig.
- Prototype vereist geen subclassificatie, maar het vereist wel een initialisatiebewerking. Fabrieksmethode vereist subclassificatie, maar “trequire initialiseren.
- Het voordeel van een fabrieksmethode is dat het dezelfde instantie meerdere keren kan retourneren, of een subklasse kan retourneren in plaats van een object van dat exacte type.
- Sommige voorstanders van Factory Method bevelen aan dat als een kwestie van taalontwerp (of als dat niet lukt, als een kwestie van stijl ) absoluut alle constructeurs moeten privé of beschermd zijn. Het is geen oneelse zaak of een klasse een nieuw object vervaardigt of een oud object hergebruikt.
- De
new
-operator wordt als schadelijk beschouwd. Er is een verschil tussen het aanvragen van een object en het maken van een object. De operatornew
maakt altijd een object en slaagt er niet in om het maken van objecten in te kapselen.Een fabrieksmethode dwingt die inkapseling af en staat toe dat een object wordt aangevraagd zonder onlosmakelijke koppeling met de scheppingshandeling.
Steun onze gratis website en bezit het eBoek!
- 22 ontwerppatronen en 8 principes grondig uitgelegd
- 406 goed gestructureerde, gemakkelijk te lezen, jargonvrije paginas
- 228 duidelijke en nuttige illustraties en diagrammen
- Een archief met codevoorbeelden in 4 talen
- Alle apparaten ondersteund: EPUB / MOBI / PDF-formaten
Meer informatie …