110 likes | 297 Views
Prototype (design pattern). Bc. Martin Petru ňa 9 .10.2012 SAI. Zaradenie. Prototype patrí medzi vytváracie návrhové vzory Schéma:. Účastníci. Prototype – definuje rozhranie pre klonovanie sa mého seba
E N D
Prototype (design pattern) Bc. Martin Petruňa 9.10.2012 SAI
Zaradenie • Prototypepatrí medzi vytváracie návrhové vzory • Schéma:
Účastníci • Prototype– definuje rozhranie pre klonovaniesamého seba • ConcretePrototype – implementujerozhranie, ktoré definuje Prototype (podľa neho sa potom vytvárajú ďalšie objekty) • Client– vytvára nové objekty pomocou klonovania ConcretePrototype • Je dobré si uvedomiť, že stále ide o oddelenie konštrukcie objektu od jeho použitia.
Prototype !=Clone • Clone má širší význam, obecne ide o vytvorenie kópie objektu s rovnakým stavom, ktorá sa nachádza niekde inde v pamäti. • Prototypevyužíva clone na vyriešenie väčšieho problému – ako oddeliť konštrukciu objektu od jeho použitia. • Jediná vhodná / preferovaná metóda vytvorenia objektu je skopírovanie prototypovej inštancie. • Kód vytvárajúci prototypy je aj jediný, ktorí musívedieť ako objekty vytvoriť (a efektívne sa stáva takou „Factory“).
Prototype > Clone • ConcretePrototypesžijú večšinou v PrototypeFactory, ktorá je implementovaná tak, že pomocou clone() vytvára nové inštancie objektov.
Využitie a výhody • Potrebujem len jednuFactory • Menej tried (žiadnysubclassing, hierarchie) • Nevyžadujeme, aby každá metóda vracala rovnaký typ • Nové „triedy“ bez programovania (klonovanie je vlastne taká inštancionalizácia triedy) • Nevýhodou môžu byť nároky kladené na vytvárajúci kód (ten musí „vedieť“ ako kompletne postaviť prototypy)
Aliasy Prototype Patternu • Prototype pattern • Propertypattern • Do-It-YourselfReflection • AdaptiveObject Modeling
Príklady (1) • Eclipse • org.eclipse.jdt.core.dom – silne typované triedy použité na modelovanie samotného programovacieho jazyka (napr. Java)
Príklady (2) • Javascript CanvasObject= (function() { function CanvasObject() {} CanvasObject.prototype.selected= false; CanvasObject.prototype.draw= function(ctx) {}; CanvasObject.prototype.drawSelection= function(ctx) {}; ... LinkingObject= (function(_super) { ... LinkingObject.prototype.updateDockingPoints= function(ctx) { var f, p1, p2, t; f = this.computeCenter(ctx, this.from); ... })(CanvasObject);