factory method pattern
abstract factory pattern