Fabrikkmetode


Pseudokode

Dette eksemplet illustrerer hvordan fabrikkmetoden kan brukes til å lage plattform-UI-elementer uten å koble klientkoden til konkrete UI-klasser.

Dialogeksempelet på tvers av plattformer.

Basisdialogklassen bruker forskjellige UI-elementer for å gjengi vinduet. Under forskjellige operativsystemer kan disse elementene se litt annerledes ut, men de bør fortsatt oppføre seg konsekvent. En knapp i Windows er fortsatt en knapp i Linux.

Når fabrikkmetoden kommer til spill, trenger du ikke å omskrive logikken i dialogboksen for hvert operativsystem. Hvis vi erklærer en fabrikkmetode som produserer knapper i basisdialogklassen, kan vi senere opprette en dialogunderklasse som returnerer Windows-stilte knapper fra fabrikkmetoden. Underklassen arver deretter mesteparten av dialogens kode fra baseklassen, men takket være fabrikkmetoden kan den gjengi Windows-utseende knapper på skjermen.

For at dette mønsteret skal fungere, må basedialogklassen arbeid med abstrakte knapper: en basisklasse eller et grensesnitt som alle konkrete knapper følger. På denne måten forblir dialogens kode funksjonell, uansett hvilken type knapper den fungerer med.

Selvfølgelig kan du også bruke denne tilnærmingen til andre brukergrensesnittelementer. Imidlertid, med hver nye fabrikkmetode du legger til i dialogen, kommer du nærmere Abstract Factory-mønsteret. Frykt ikke, vi snakker om dette mønsteret senere.

// The creator class declares the factory method that must// return an object of a product class. The creator"s subclasses// usually provide the implementation of this method.class Dialog is // The creator may also provide some default implementation // of the factory method. abstract method createButton():Button // Note that, despite its name, the creator"s primary // responsibility isn"t creating products. It usually // contains some core business logic that relies on product // objects returned by the factory method. Subclasses can // indirectly change that business logic by overriding the // factory method and returning a different type of product // from it. method render() is // Call the factory method to create a product object. Button okButton = createButton() // Now use the product. okButton.onClick(closeDialog) okButton.render()// Concrete creators override the factory method to change the// resulting product"s type.class WindowsDialog extends Dialog is method createButton():Button is return new WindowsButton()class WebDialog extends Dialog is method createButton():Button is return new HTMLButton()// The product interface declares the operations that all// concrete products must implement.interface Button is method render() method onClick(f)// Concrete products provide various implementations of the// product interface.class WindowsButton implements Button is method render(a, b) is // Render a button in Windows style. method onClick(f) is // Bind a native OS click event.class HTMLButton implements Button is method render(a, b) is // Return an HTML representation of a button. method onClick(f) is // Bind a web browser click event.class Application is field dialog: Dialog // The application picks a creator"s type depending on the // current configuration or environment settings. method initialize() is config = readApplicationConfigFile() if (config.OS == "Windows") then dialog = new WindowsDialog() else if (config.OS == "Web") then dialog = new WebDialog() else throw new Exception("Error! Unknown operating system.") // The client code works with an instance of a concrete // creator, albeit through its base interface. As long as // the client keeps working with the creator via the base // interface, you can pass it any creator"s subclass. method main() is this.initialize() dialog.render()

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *