Metoda fabrică


Pseudocod

Acest exemplu ilustrează modul în care metoda fabrică poate fi utilizată pentru crearea de elemente de interfață UI fără a cupla codul clientului la clase de UI concrete.

Exemplul de dialog pe mai multe platforme.

Clasa de dialog de bază folosește diferite elemente de interfață pentru a reda fereastra. În cadrul diferitelor sisteme de operare, aceste elemente pot arăta puțin diferit, dar ar trebui să se comporte în mod consecvent. Un buton din Windows este încă un buton în Linux.

Când metoda din fabrică intră în joc, nu este necesar să rescrieți logica dialogului pentru fiecare sistem de operare. Dacă declarăm o metodă din fabrică care produce butoane în clasa de dialog de bază, putem crea ulterior o subclasă de dialog care returnează butoanele în stil Windows din metoda din fabrică. Subclasa moștenește apoi majoritatea codului dialogului din clasa de bază, dar, datorită metodei din fabrică, poate reda butoanele cu aspect Windows pe ecran.

Pentru ca acest model să funcționeze, clasa de dialog de bază trebuie lucrați cu butoane abstracte: o clasă de bază sau o interfață pe care o urmează toate butoanele concrete. În acest fel, codul dialogului rămâne funcțional, indiferent de tipul de butoane cu care funcționează.

Desigur, puteți aplica această abordare și altor elemente de interfață. Cu toate acestea, cu fiecare nouă metodă din fabrică pe care o adăugați în casetă de dialog, vă apropiați de modelul Fabrica abstractă. Nu vă temeți, vom vorbi despre acest model mai târziu.

// 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()

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *