abstract factory pattern
structural pattern
structural pattern