Prototypový vzor - Prototype pattern
![]() | Tento článek má několik problémů. Prosím pomozte vylepši to nebo diskutovat o těchto otázkách na internetu diskusní stránka. (Zjistěte, jak a kdy tyto zprávy ze šablony odebrat) (Zjistěte, jak a kdy odstranit tuto zprávu šablony)
|
The prototypový vzor je kreativní návrhový vzor v vývoj softwaru. Používá se, když je typ předměty vytvořit je určeno a prototyp instance, který je klonován za účelem výroby nových objektů. Tento vzor se používá k:
- vyhýbat se podtřídy tvůrce objektu v klientské aplikaci, jako je vzor tovární metody dělá.
- vyhnout se inherentním nákladům na vytvoření nového objektu standardním způsobem (např. pomocíNový 'klíčové slovo), pokud je to pro danou aplikaci neúměrně drahé.
Chcete-li implementovat vzor, deklarujte abstrakt základní třída který určuje a čistě virtuální klon () metoda. Jakákoli třída, která potřebuje „polymorfní konstruktor "schopnost se odvozuje z abstraktní základní třídy a implementuje klon () úkon.
Klient namísto psaní kódu, který vyvolá operátor „new“ na pevně zadaný název třídy, zavolá klon () metoda na prototypu, volá a tovární metoda s parametr konkrétní beton odvozená třída požadované nebo vyvolá klon () metoda prostřednictvím nějakého mechanismu poskytnutého jiným vzorem návrhu.
The mitotické dělení buňky - výsledkem jsou dvě identické buňky - je příkladem prototypu, který hraje aktivní roli při kopírování, a tak demonstruje prototypový vzor. Když se buňka rozdělí, vzniknou dvě buňky stejného genotypu. Jinými slovy, buňka se sama klonuje.[1]
Přehled
prototyp[2]designový vzor je jedním z dvaceti tří známých GoF návrhové vzory které popisují, jak řešit opakující se konstrukční problémy při navrhování flexibilního a opakovaně použitelného objektově orientovaného softwaru, tj. objektů, které se snadněji implementují, mění, testují a znovu používají.
Návrhový vzor Prototyp řeší problémy jako:[3]
- Jak lze vytvořit objekty, aby bylo možné určit, které objekty se mají vytvořit za běhu?
- Jak lze vytvořit instanci dynamicky načtených tříd?
Vytváření objektů přímo v rámci třídy, která vyžaduje (používá) objekty, je nepružná, protože zavazuje třídu k určitým objektům v době kompilace a znemožňuje určit, které objekty mají být vytvořeny za běhu.
Návrhový vzor Prototyp popisuje, jak takové problémy vyřešit:
- Definovat a
Prototyp
objekt, který vrací kopii sebe sama. - Vytvořte nové objekty zkopírováním a
Prototyp
objekt.
To umožňuje konfiguraci třídy s různými Prototyp
objekty, které se kopírují a vytvářejí nové objekty, a ještě více, Prototyp
objekty lze přidávat a odebírat za běhu.
Viz také diagram tříd a sekvencí UML níže.
Struktura
Třída a sekvenční diagram UML

Ve výše uvedeném UML třídní diagram, Klient
třída, která vyžaduje a Produkt
objekt nevytváří instanci Produkt1
třída přímo. Místo toho Klient
Odkazuje na Prototyp
rozhraní pro klonování objektu Produkt1
třída implementuje Prototyp
vytvořením vlastní kopie.
The UML sekvenční diagram ukazuje interakce za běhu: Klient
volání objektu klon ()
na prototyp: Produkt1
objekt, který vytvoří a vrátí jeho kopii (a product: Product1
objekt).
Diagram tříd UML

Pravidla
Někdy kreační vzory překrytí - existují případy, kdy buď prototyp, nebo abstraktní továrna by bylo vhodné. Jindy se navzájem doplňují: abstraktní továrna by mohla uložit sadu prototypů, ze kterých bude možné klonovat a vrátit objekty produktu (GoF, str. 126). Abstraktní továrna, stavitel a prototyp lze použít jedináček v jejich implementacích. (GoF, str. 81, 134). Abstraktní tovární třídy jsou často implementovány továrními metodami (tvorba prostřednictvím dědictví ), ale lze je implementovat pomocí prototypu (tvorba prostřednictvím delegace ). (GoF, str. 95)
Designy často začínají používat Factory Method (méně komplikované, přizpůsobitelnější, rozmnožují se podtřídy) a vyvíjejí se směrem k abstraktní továrně, prototypu nebo staviteli (flexibilnější, komplexnější), protože návrhář zjistí, kde je potřeba větší flexibilita. (GoF, str. 136)
Prototyp nevyžaduje podtřídu, ale vyžaduje operaci „inicializace“. Tovární metoda vyžaduje podtřídu, ale nevyžaduje inicializaci. (GoF, str. 116)
Designy, které hojně využívají kompozitní a natěrač vzory mohou také těžit z prototypu. (GoF, str. 126)
Pravidlem může být, že budete muset klonovat () Objekt když chcete vytvořit další objekt za běhu to je pravá kopie objektu, který klonujete. Pravá kopie znamená, že všechny atributy nově vytvořeného objektu by měly být stejné jako objekt, který klonujete. Kdybys mohl instance třídy pomocí Nový místo toho byste dostali Objekt se všemi atributy jako jejich počátečními hodnotami. Například pokud navrhujete systém pro provádění transakcí bankovních účtů, pak byste chtěli vytvořit kopii Objektu, který obsahuje informace o vašem účtu, provádět transakce na a poté nahraďte původní objekt upraveným. V takových případech byste místo nových chtěli použít clone ().
Ukázky kódu
Pseudo kód
Napíšeme třídu prohlížeče výskytů pro text. Tato třída uvádí výskyty slova v textu. Vytvoření takového objektu je nákladné, protože umístění výskytů vyžaduje nákladný proces hledání. K duplikování takového objektu tedy použijeme vzor prototypu:
třída WordOccurrences je pole výskyty je Seznam rejstříku každého výskytu slova v textu. konstruktor WordOccurrences (text, word) je vstup: the text ve kterých je třeba najít výskyty vstup: the slovo který by se měl objevit v textu Vyprázdnit výskyty seznam pro každého textový index v text isMatching: = true pro každého wordIndex v slovo -li znak aktuálního slova neodpovídá znaku aktuálního textu pak isMatching: = false -li isMatching je pravda pak Přidejte aktuální textIndex do výskyty seznam metoda getOneOccurrenceIndex (n) je vstup: číslo směřující na nth výskyt. výstup: index indexu nth výskyt. Vraťte nth položka z výskyty pole, pokud existuje. metoda klon () je výstup: objekt WordOccurrences obsahující stejná data. Zavolejte clone () na super třídu. Na vrácený objekt nastavte výskyty pole s hodnotou místní výskyty pole. Vrátit klonovaný objekt.text: = "Prototypový vzor je kreační návrhový vzor ve vývoji softwaru, který byl poprvé popsán v návrhových vzorech, v knize." Word: = "pattern" dsearchEngine: = new WordOccurrences (text, word) anotherSearchEngine: = searchEngine .clone ()
(vyhledávací algoritmus není optimalizován; je to základní algoritmus pro ilustraci implementace vzoru)
Příklad C #
Tento vzor vytváří konkrétní typ objektu pomocí svého prototypu. Jinými slovy, při vytváření objektu Prototypového objektu třída ve skutečnosti vytvoří jeho klon a vrátí jej jako prototyp. Můžete vidět zde, použili jsme metodu MemberwiseClone ke klonování prototypu, když to bylo požadováno.
veřejnost abstraktní třída Prototyp{ // normální implementace veřejnost abstraktní Prototyp Klonovat();}veřejnost třída Prototyp betonu : Prototyp{ veřejnost přepsat Prototyp Klonovat() { vrátit se (Prototyp)tento.MemberwiseClone(); // Klonuje konkrétní třídu. }}veřejnost třída Betonový prototyp 2 : Prototyp{ veřejnost přepsat Prototyp Klonovat() { vrátit se (Prototyp)tento.MemberwiseClone(); // Klonuje konkrétní třídu. }}
Příklad C ++
Diskuse o návrhovém vzoru spolu s kompletní ilustrativní ukázkou implementace pomocí polymorfního designu třídy jsou uvedeny v C ++ anotace.
Příklad Java
Tento vzor vytváří druh objektu pomocí svého prototypu. Jinými slovy, při vytváření objektu Prototypového objektu třída vytvoří jeho klon a vrátí jej jako prototyp. Klonování metody bylo použito ke klonování prototypu, když to bylo požadováno.
// Prototypový vzorveřejnost abstraktní třída Prototyp nářadí Cloneable { veřejnost Prototyp klon() hodí CloneNotSupportedException{ vrátit se (Prototyp) super.klon(); }} veřejnost třída Betonový prototyp 1 rozšiřuje Prototyp { @ Přepis veřejnost Prototyp klon() hodí CloneNotSupportedException { vrátit se (Betonový prototyp 1)super.klon(); }}veřejnost třída Betonový prototyp 2 rozšiřuje Prototyp { @ Přepis veřejnost Prototyp klon() hodí CloneNotSupportedException { vrátit se (Betonový prototyp 2)super.klon(); }}
Příklad PHP
// Prototypový vzor v PHP se provádí pomocí vestavěné funkce PHP __clone ()abstraktní třída Prototyp{ veřejnost tětiva $ a; veřejnost tětiva $ b; veřejnost funkce displayCONS(): prázdnota { echo "NEVÝHODY: {$ toto->A} n"; echo "NEVÝHODY: {$ toto->b} n"; } veřejnost funkce displayCLON(): prázdnota { echo "CLON: {$ toto->A} n"; echo "CLON: {$ toto->b} n"; } abstraktní funkce __clone();}třída Betonový prototyp 1 rozšiřuje Prototyp{ veřejnost funkce __postavit() { $ toto->A = „A1“; $ toto->b = „B1“; $ toto->displayCONS(); } funkce __clone() { $ toto->displayCLON(); }}třída Betonový prototyp 2 rozšiřuje Prototyp{ veřejnost funkce __postavit() { $ toto->A = „A2“; $ toto->b = „B2“; $ toto->displayCONS(); } funkce __clone() { $ toto->A = $ toto->A ."-C"; $ toto->b = $ toto->b ."-C"; $ toto->displayCLON(); }}$ cP1 = Nový Prototyp betonu();$ cP2 = Nový Betonový prototyp2();$ cP2C = klon $ cP2;// VÝSLEDEK: # quanton81// NEVÝHODY: A1// NEVÝHODY: B1// NEVÝHODY: A2// NEVÝHODY: B2// CLON: A2-C// CLON: B2-C
Příklad Pythonu
Python verze 3.8+
z abc import ABC, abstraktní metodaz psaní na stroji import AnyStrtřída A(ABC): "" "Abstraktní třída" "" @abstractmethod def kdo je(já) -> AnyStr: složittřída Beton(A): "" "Třída betonu" "" def kdo je(já) -> AnyStr: "" "Přepsání metody whois () abstraktní třídy A" "" vrátit se F"Beton: {já}"C = Beton()tisk(C.kdo je())
Výstup:
Beton: <__ main __. Betonový objekt v 0x1023bafd0>
Viz také
Reference
- ^ Duell, Michael (červenec 1997). "Nesowarové příklady návrhových vzorů". Object Magazine. 7 (5): 54. ISSN 1055-3614.
- ^ Erich Gamma; Richard Helm; Ralph Johnson; John Vlissides (1994). Návrhové vzory: Prvky opakovaně použitelného objektově orientovaného softwaru. Addison Wesley. str.117ff. ISBN 0-201-63361-2.
- ^ „Návrhový vzor prototypu - problém, řešení a použitelnost“. w3sDesign.com. Citováno 2017-08-17.
Zdroje
- Gamma, Erichu; Helm, Richard; Johnson, Ralph; Vlissides, Johne (1994). Návrhové vzory: Prvky opakovaně použitelného objektově orientovaného softwaru. Addison-Wesley. ISBN 0-201-63361-2.