Prototype

Z PHPEdia.pl
Skocz do: nawigacji, wyszukiwania

Charakterystyka

Metody Prototypu (ang. Prototype) zwracają klon obiektu przekazanego jako argument. Może być on ewentualnie nieznacznie zmodyfikowany.

Założenia

Wzorzec pozwala na:

  • tworzenie zmodyfikowanych klonów obiektów
  • głębokie/pśytkie klonowanie

przykładowe implementacje

<?php
abstract class MojaKlasa {
 
	/**
	 * @var string
	 * @access public
	 * Zmienna zawierajaca nazwe naszego obiektu
	 */
	public $nazwa;
 
	/**
	 * @return void
	 * @access public
	 * Drukuje nazwe obiektu na 'standardowe' wyjscie ;)
	 */
	public function Nazwa() {
		echo "To jest $this->nazwa\n";
	}
}
 
final class Obiekt extends MojaKlasa {
 
	/**
	 * @return void
	 * @access public
	 * Tworzy nowa instancje Obiekt i nadaje mu nazwe "Oryginal"
	 */
	public function __construct() {
		$this->nazwa = "Oryginaś";
	}
}
 
 
class Prototyp {
 
	/**
	 * @return MojaKlasa Sklonowany obiekt o nowych wlasciwosciach.
	 * @access public
	 * @param MojaKlasa Obiekt, ktory zostanie poddany klonowaniu i modyfikacji.
	 * Tworzy kopie obiektu MojaKlasa poprzez plytkie klonowanie,
	 *  nadajac mu nazwe 'Kopia' i modyfikujac w ten sposob jego wlasciwosci.
	 */
	static public function Klonuj(MojaKlasa $obiekt) {
		try {
			$klon = clone $obiekt;
			$klon->nazwa = "Kopia";
			return $klon;
		} catch( Exception $e ) {
			echo $e->getMessage();
		}
	}
}
 
/**
 * Tworzymy nowy obiekt a nastepnie klonujemy go dzieki wzorcowi Prototyp.
 */
$klasa = new Obiekt();
$klon = Prototyp::Klonuj($klasa);
 
/**
 * Sprawdzamy czy mamy do czynienia z oryginalem czy kopia.
 */
$klasa->Nazwa();
$klon->Nazwa();
?>

Wyjście tego skryptu jest następujące:

To jest oryginal
To jest klon

Kiedy używać

Wtedy, kiedy tworzenie nowej instancji klasy "nie opśaca" się ze wzglądu na narzut czasowy. Takimi przykładowymi sytuacjami jest wyciąganie wielu rekordów z bazy danych. Zwrżcona instancja klasy reprezentującej wynik zapytania, może zostać sklonowana i poddana różnorodnym przeksztaśceniom/operacjom.

Zaprezentowane w przykładzie pśytkie klonowanie (z użyciem clone), może zostać zastąpione przez głębokie klonowanie np. serializację obiektu a następnie jego zapis do pliku i powtżrne wykorzystanie w przyszłości.

Polecamy również