@startuml
package com.iluwatar.singleton {
  class App {
    - LOGGER : Logger {static}
    + App()
    + main(args : String[]) {static}
  }
  enum EnumIvoryTower {
    + INSTANCE {static}
    + toString() : String
    + valueOf(name : String) : EnumIvoryTower {static}
    + values() : EnumIvoryTower[] {static}
  }
  class InitializingOnDemandHolderIdiom {
    - InitializingOnDemandHolderIdiom()
    + getInstance() : InitializingOnDemandHolderIdiom {static}
  }
  -class HelperHolder {
    - INSTANCE : InitializingOnDemandHolderIdiom {static}
    - HelperHolder()
  }
  class IvoryTower {
    - INSTANCE : IvoryTower {static}
    - IvoryTower()
    + getInstance() : IvoryTower {static}
  }
  class ThreadSafeDoubleCheckLocking {
    - flag : boolean {static}
    - instance : ThreadSafeDoubleCheckLocking {static}
    - ThreadSafeDoubleCheckLocking()
    + getInstance() : ThreadSafeDoubleCheckLocking {static}
  }
  class ThreadSafeLazyLoadedIvoryTower {
    - instance : ThreadSafeLazyLoadedIvoryTower {static}
    - ThreadSafeLazyLoadedIvoryTower()
    + getInstance() : ThreadSafeLazyLoadedIvoryTower {static}
  }
}
IvoryTower -->  "-INSTANCE" IvoryTower
ThreadSafeDoubleCheckLocking -->  "-instance" ThreadSafeDoubleCheckLocking
ThreadSafeLazyLoadedIvoryTower -->  "-instance" ThreadSafeLazyLoadedIvoryTower
HelperHolder ..+ InitializingOnDemandHolderIdiom
HelperHolder -->  "-INSTANCE" InitializingOnDemandHolderIdiom
@enduml