@startuml package com.iluwatar.prototype { class OrcWarlord { + OrcWarlord() + clone() : Warlord + toString() : String } class OrcBeast { + OrcBeast() + clone() : Beast + toString() : String } abstract class Beast { + Beast() + clone() : Beast {abstract} } class ElfMage { + ElfMage() + clone() : Mage + toString() : String } abstract class Mage { + Mage() + clone() : Mage {abstract} } abstract class Prototype { + Prototype() + clone() : Object {abstract} } interface HeroFactory { + createBeast() : Beast {abstract} + createMage() : Mage {abstract} + createWarlord() : Warlord {abstract} } class ElfWarlord { + ElfWarlord() + clone() : Warlord + toString() : String } class OrcMage { + OrcMage() + clone() : Mage + toString() : String } class ElfBeast { + ElfBeast() + clone() : Beast + toString() : String } abstract class Warlord { + Warlord() + clone() : Warlord {abstract} } class HeroFactoryImpl { - beast : Beast - mage : Mage - warlord : Warlord + HeroFactoryImpl(mage : Mage, warlord : Warlord, beast : Beast) + createBeast() : Beast + createMage() : Mage + createWarlord() : Warlord } class App { + App() + main(args : String[]) {static} } } HeroFactoryImpl --> "-beast" Beast HeroFactoryImpl --> "-warlord" Warlord HeroFactoryImpl --> "-mage" Mage OrcWarlord --|> Warlord OrcBeast --|> Beast Beast --|> Prototype ElfMage --|> Mage Mage --|> Prototype ElfWarlord --|> Warlord OrcMage --|> Mage ElfBeast --|> Beast Warlord --|> Prototype HeroFactoryImpl ..|> HeroFactory @enduml