Hodně častý je prostě jednoduchý objekt Person {name: String, surname: String}. Na tom toho moc nevymyslíš.
To je náhodou velmi dobrý příklad! Předávat ven stav objektu by bylo zlo. Správně se objekt má umět sám prezentovat. Takže by měl mít třeba metodu asHtml, asCsv apod. No ale protože v OOP děláme vše univerzálně a znovupoužitelně, tyhle metody implementovat nebudeme a místo toho uděláme obecnou metodu formattedWith(formatter). Ovšem formater taky dovnitř objektu šahat nesmí. Proto je potřeba mu předat abstraktní reprezentaci objektu - strom, kde každý uzel implementuje rozhraní IFormattable. Zároveň ale tuto abstraktní reprezentaci použijeme pro serializaci! A nejenom pro serializaci, ale COKOLI! Takže abysme zajistili, že všechny uzly budou dědit z naší třídy, která vše potřebné obsahuje, použijeme pattern Factory. Čili máme singleton AbstractObjectFormattableRepresentationFactory pomocí kterého potom uzel reprezentace vytvoříme velice snadno:
AbstractObjectFormattableRepresentationFactory.makeAsbstractFormattableRepresenstationNode(string)
- pochopitelně metoda je přetížená pro všechny typy, které by mohly připadat v úvahu a volá se **uvnitř objektu**.
Ovšem nesmíme zapomenout na eventualitu, že daná část stavu objektu není v daném formátu reprezentovatelná. K tomu slouží validátor IAbstractObjectFormattableRepresentationValidator.isFormattableAs, kterému se formát předává jako objekt (nějaké stringové konstanty a podobné prasárny v OOP nevedeme!). Příslušný objekt je pochopitelně opět singleton, čili k němu máme factory, to snad není potřeba zdůrazňovat.
No nic, abych to neprotahoval - chceme-li správně objektově implementovat výpis jména do HTML, budeme potřebovat tak dvacet až stošedesáttři tříd. Shoda na tom ale nepanuje. Někteří programátoři např. tvrdí, že IAbstractObjectFormattableRepresentationValidator je nepřístojné jméno rozhraní, protože neobsahuje písmeno Z.