@startuml package com.iluwatar.semaphore { class App { + App() + main(args : String[]) {static} } class Fruit { - type : FruitType + Fruit(type : FruitType) + getType() : FruitType + toString() : String } enum FruitType { + APPLE {static} + LEMON {static} + ORANGE {static} + valueOf(name : String) : FruitType {static} + values() : FruitType[] {static} } class FruitBowl { - fruit : ArrayList + FruitBowl() + countFruit() : int + put(f : Fruit) + take() : Fruit + toString() : String } class FruitShop { - available : boolean[] - bowls : FruitBowl[] - semaphore : Semaphore + FruitShop() + countFruit() : int + returnBowl(bowl : FruitBowl) + takeBowl() : FruitBowl } interface Lock { + acquire() {abstract} + release() {abstract} } class Semaphore { - counter : int - licenses : int + Semaphore(licenses : int) + acquire() + getAvailableLicenses() : int + getNumLicenses() : int + release() } } Fruit --> "-type" FruitType FruitType ..+ Fruit FruitShop --> "-semaphore" Semaphore FruitBowl --> "-fruit" Fruit Semaphore ..|> Lock @enduml