@startuml package com.iluwatar.dao { class App { - ALL_CUSTOMERS : String {static} - DB_URL : String {static} - log : Logger {static} + App() - addCustomers(customerDao : CustomerDao) {static} - createDataSource() : DataSource {static} - createSchema(dataSource : DataSource) {static} - deleteSchema(dataSource : DataSource) {static} + generateSampleCustomers() : List {static} + main(args : String[]) {static} - performOperationsUsing(customerDao : CustomerDao) {static} } class Customer { - firstName : String - id : int - lastName : String + Customer(id : int, firstName : String, lastName : String) + equals(that : Object) : boolean + getFirstName() : String + getId() : int + getLastName() : String + hashCode() : int + setFirstName(firstName : String) + setId(id : int) + setLastName(lastName : String) + toString() : String } interface CustomerDao { + add(Customer) : boolean {abstract} + delete(Customer) : boolean {abstract} + getAll() : Stream {abstract} + getById(int) : Optional {abstract} + update(Customer) : boolean {abstract} } class CustomerSchemaSql { + CREATE_SCHEMA_SQL : String {static} + DELETE_SCHEMA_SQL : String {static} - CustomerSchemaSql() } class DbCustomerDao { - LOGGER : Logger {static} - dataSource : DataSource + DbCustomerDao(dataSource : DataSource) + add(customer : Customer) : boolean - createCustomer(resultSet : ResultSet) : Customer + delete(customer : Customer) : boolean + getAll() : Stream + getById(id : int) : Optional - getConnection() : Connection - mutedClose(connection : Connection, statement : PreparedStatement, resultSet : ResultSet) + update(customer : Customer) : boolean } class InMemoryCustomerDao { - idToCustomer : Map + InMemoryCustomerDao() + add(customer : Customer) : boolean + delete(customer : Customer) : boolean + getAll() : Stream + getById(id : int) : Optional + update(customer : Customer) : boolean } } DbCustomerDao ..|> CustomerDao InMemoryCustomerDao ..|> CustomerDao @enduml