Metoda fabryczna


Pseudokod

Ten przykład ilustruje, jak można użyć metody fabryki do tworzenia międzyplatformowych elementów UI bez łączenia kodu klienta z konkretnymi klasami UI.

Przykład wieloplatformowego okna dialogowego.

Podstawowa klasa okna dialogowego używa różnych elementów interfejsu użytkownika do renderowania swojego okna. W różnych systemach operacyjnych elementy te mogą wyglądać nieco inaczej, ale nadal powinny zachowywać się konsekwentnie. Przycisk w systemie Windows jest nadal przyciskiem w systemie Linux.

Kiedy w grę wchodzi metoda fabryczna, nie ma potrzeby przepisywania logiki okna dialogowego dla każdego systemu operacyjnego. Jeśli zadeklarujemy metodę fabryczną, która tworzy przyciski wewnątrz podstawowej klasy okna dialogowego, możemy później utworzyć podklasę okna dialogowego, która zwraca przyciski w stylu systemu Windows z metody fabrycznej. Podklasa dziedziczy wtedy większość kodu okna dialogowego z klasy bazowej, ale dzięki metodzie fabrycznej może renderować przyciski na ekranie wyglądające jak Windows.

Aby ten wzorzec działał, podstawowa klasa okna dialogowego musi pracować z przyciskami abstrakcyjnymi: klasą bazową lub interfejsem, za którym podążają wszystkie konkretne przyciski. W ten sposób kod okna dialogowego pozostaje funkcjonalny, niezależnie od typu przycisków, z którymi współpracuje.

Oczywiście możesz zastosować to podejście również do innych elementów interfejsu użytkownika. Jednak z każdą nową metodą fabryki dodawaną do okna dialogowego zbliżasz się do wzorca Fabryka abstrakcyjna. Nie bój się, o tym wzorcu porozmawiamy później.

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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *