Tovární metoda


Pseudokód

Tento příklad ukazuje, jak lze použít Tovární metodu pro vytváření prvků uživatelského rozhraní mezi platformami bez propojení kódu klienta s konkrétními třídami uživatelského rozhraní.

Příklad dialogu napříč platformami.

Základní třída dialogového okna používá k vykreslení svého okna různé prvky uživatelského rozhraní. V různých operačních systémech mohou tyto prvky vypadat trochu jinak, ale stále by se měly chovat konzistentně. Tlačítko v systému Windows je stále tlačítkem v systému Linux.

Když vstoupí do hry tovární metoda, nemusíte přepisovat logiku dialogu pro každý operační systém. Pokud deklarujeme tovární metodu, která produkuje tlačítka uvnitř základní třídy dialogu, můžeme později vytvořit podtřídu dialogu, která vrací tlačítka ve stylu Windows z tovární metody. Podtřída poté zdědí většinu kódu dialogu ze základní třídy, ale díky tovární metodě může na obrazovce vykreslit tlačítka vypadající jako Windows.

Aby tento vzor fungoval, musí základní třída dialogu práce s abstraktními tlačítky: základní třída nebo rozhraní, které následují všechna konkrétní tlačítka. Tímto způsobem zůstane kód dialogového okna funkční bez ohledu na to, s jakým typem tlačítek pracuje.

Tento přístup můžete samozřejmě použít i na další prvky uživatelského rozhraní. S každou novou tovární metodou, kterou přidáte do dialogu, se však přiblížíte vzoru abstraktní továrny. Nebojte se, o tomto vzoru si promluvíme později.

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *