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 zawierająca nazwę naszego obiektu
	 */
	public $nazwa;
 
	/**
	 * @return void
	 * @access public
	 * Drukuje nazwe obiektu na 'standardowe' wyjście ;)
	 */
	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 nazwę "Oryginał"
	 */
	public function __construct() {
		$this->nazwa = "oryginał";
	}
}
 
 
class Prototyp {
 
	/**
	 * @return MojaKlasa Sklonowany obiekt o nowych właściwościach.
	 * @access public
	 * @param MojaKlasa Obiekt, który zostanie poddany klonowaniu i modyfikacji.
	 * Tworzy kopie obiektu MojaKlasa poprzez płytkie klonowanie,
	 *  nadając mu nazwę 'Kopia' i modyfikując w ten sposób jego właściwości.
	 */
	static public function Klonuj(MojaKlasa $obiekt) {
		$klon = clone $obiekt;
		$klon->nazwa = "klon";
		return $klon;
	}
}
 
/**
 * Tworzymy nowy obiekt a następnie klonujemy go dzięki wzorcowi Prototyp.
 */
$klasa = new Obiekt();
$klon = Prototyp::Klonuj($klasa);
 
/**
 * Sprawdzamy czy mamy do czynienia z oryginałem czy kopia.
 */
$klasa->Nazwa();
$klon->Nazwa();
?>

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

To jest oryginał
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.

Strona ta opisuje jeden z Wzorców projektowych.

Wzorce projektowe: Definicja | Zalety | Podział wzorców | Lista wzorców