Prototyp (návrhový vzor): Porovnání verzí

Smazaný obsah Přidaný obsah
Nová stránka: Návrhový vzor Prototype patří do rodiny tzv. creational design patterns (vytvářecí návrhové vzory). Používá se, když je vytváření instance třídy velmi časově ná...
 
Bez shrnutí editace
Řádek 1:
Návrhový vzor Prototype patří do rodiny tzv. creational design patterns (vytvářecí návrhové vzory).
 
Používá se, když je vytváření instance třídy velmi časově náročné nebo nějak výrazně složité. Potom je výhodnější než náročně vytvářet mnoho instancí, vytvořit jednu a ostatní objekty z ní naklonovat. Může být take použit když jsou potřeba třídy, které se liší pouze v tom, jaké zpracování nabízejí.
 
Klonování se provádí implementací speciální metody, která vytvoří klon aktuálního objektu. Metoda může využívat systémové metody pro klonování (viz. níže) nebo může objekt vytvářet jiným způsobem. Také může obsahovat další operace s objektem (změnu některých dat a vlastností objektu).
 
Obdobnou funkčnost může také poskytovat tovární metoda, která je jednodušší na implementaci.
 
Standardní výsledek klonování je tzv. mělká kopie (pokud je v objektu odkaz na další objekt, zkopíruje se pouze reference). Pro získání tzv. hluboké kopie (nekopírují se pouze reference, ale celé objekty) je možné buď takovou funkcionalitu integrovat od implementace metody clone objektu nebo se vytváří nová metoda deepClone.
 
Řádek 15 ⟶ 19:
 
Výhodou klonování je, že program může pracovat s daty a různě je upravovat bez obav, že to ovlivní další části programu. To se může hodit např. při vracení interního pole (či kontejneru).
 
== Implementace ==
 
=== Java ===
Řádek 30 ⟶ 36:
Potíž v implementaci návrhového vzoru Prototype v jazyce Java je, že pokud už třída existuje, nemusí být možné implementovat metody clone nebo deepClone. Speciálně metodu deepClone může být obtížné implementovat, pokud není možné deklarovat všechny objekty v třídě tak, aby implementovaly interface Serializable.
 
=== Ukázkový kód ===
 
<code>
Řádek 193 ⟶ 198:
 
Někdy se návrhové vzory překrývají – jsou případy, kdy Prototyp ani Abstraktní továrna nebude vhodné použít. Jindy zase doplňují jeden druhý: Abstraktní továrna může ukládat sadu Prototypů ze kterých se klonuje a vracejí se objekty (GoF, p126). Abstraktní továrna, Stavitel a Prototyp mohou použít při implementaci Jedináčka (Singleton) (GoF, p81, 134). Abstraktní továrna je často implmentována s Tovární metodou (vytváření přes dědičnost), ale mohou být take vytvořeny pomocí Prototypu (vytváření přes pověření). (GoF, p95)
 
Často začnou programátoři používat Tovární metodu (jednodušší, vice přizpůsobitelná) a následně se vyvine v Abstraktní továrnu, Prototyp nebo Stavitele (pružnější, komplexnější) poté, co programátor zjistí, kde je potřeba vice flexibility (GoF, p136).
 
Rozdíl mezi Prototypem a Tovární metodou je, že Prototyp nevyžaduje dědění tříd, vyžaduje ale úvodní inicializaci. Naopak Tovární metoda vyžaduje dědění tříd, nevyžaduje inicializaci (GoF, p116).
 
Z Prototypu může mít užitek i design, který hojně využívá vzory Strom a Dekorátor. (GoF, p126)
 
Pokud budete potřebovat zavolat metodu clone() na objektu když budete chtít vytvořit další objekt při běhu, který je skutečnou kopií objektu, který klonujete. Skutečná kopie znamená, že všechny atributy nově vytvořeného objektu by měly být stejné, jako u původního. Pokud by byla třída vytvořena pomocí klíčového slova “new”, měl by objekt věchny hodnoty s výchozími hodnotami. Např. pokud navrhujete system pro bankovní operace, budete chtít vytvořit kopi objektu, který udržuje informace o vašem účtu, provést na něm požadované operace a potom jím přepsat původní objekt. V tomto případě budete chtít použít metodu clone() místo “new”.
 
Zdroje
<ref>[1] James W. Cooper – The Design Patterns Java Companion (http://www.patterndepot.com/put/8/JavaPatterns.htm)</ref>
<ref>[2] Prototype Pattern – (http://en.wikipedia.org/wiki/Prototype_pattern)</ref>